RIC-641 Fixing client/server model definitions and adding client and server API

Signed-off-by: sandeepindia <kumar.sandeep3@hcl.com>
Change-Id: Ic177b9b7c417f1ccc184ae0e945b7748582604fe
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 01f8da0..b17af09 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -100,7 +100,7 @@
 	-DMAJOR_VER=${major_version}
 	-DMINOR_VER=${minor_version}
 	-DPATCH_VER=${patch_level}
-	-DDEBUG=${debugging}
+	#-DDEBUG=${debugging}
 )
 
 # ---------------- suss out pkg gen tools so we don't fail generating packages that the system cannot support --------------
@@ -156,10 +156,13 @@
 # but Cmake insists on having these exist when we add them to include directories to
 # enable code to find them after we build them.
 #
-include_directories("${srcd}/src/messaging;${srcd}/src/json;${srcd}/src/alarm;${srcd}/src/metrics;${srcd}/src/config;${srcd}/src/rest/model;${srcd}/ext/jsmn")
+#include_directories( "${srcd}/src/messaging;${srcd}/src/json;${srcd}/src/alarm;${srcd}/src/metrics;${srcd}/src/config;${srcd}/ext/jsmn" )
+include_directories( "${srcd}/src/messaging;${srcd}/src/json;${srcd}/src/alarm;${srcd}/src/metrics;${srcd}/src/config;${srcd}/ext/jsmn;;${srcd}/src/model;${srcd}/src/rest-client;${srcd}/src/rest-server" )
 
 # Compiler flags
 #
+#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
+#set(CMAKE_CXX_STANDARD 17)
 set( CMAKE_POSITION_INDEPENDENT_CODE ON )
 set( CMAKE_C_FLAGS "-g " )
 set( CMAKE_CPP_FLAGS "-g " )
@@ -188,13 +191,16 @@
 add_subdirectory( src/alarm )
 add_subdirectory( src/metrics )
 add_subdirectory( src/config )
-add_subdirectory( src/rest )
+add_subdirectory( src/model )
+add_subdirectory( src/rest-client )
+add_subdirectory( src/rest-server )
+
 #add_subdirectory( doc )				# this will auto skip if {X}fm is not available
 
 # shared and static libraries are built from the same object files.
 #
 add_library( ricxfcpp_shared SHARED
-	"$<TARGET_OBJECTS:message_objects>;$<TARGET_OBJECTS:json_objects>;$<TARGET_OBJECTS:alarm_objects>;$<TARGET_OBJECTS:metrics_objects>;$<TARGET_OBJECTS:config_objects>;$<TARGET_OBJECTS:xapp_objects>"
+	"$<TARGET_OBJECTS:message_objects>;$<TARGET_OBJECTS:json_objects>;$<TARGET_OBJECTS:alarm_objects>;$<TARGET_OBJECTS:metrics_objects>;$<TARGET_OBJECTS:config_objects>;$<TARGET_OBJECTS:xapp_objects>;$<TARGET_OBJECTS:model_objects>;$<TARGET_OBJECTS:rest-client_objects>;$<TARGET_OBJECTS:rest-server_objects>"
 )
 set_target_properties( ricxfcpp_shared
 	PROPERTIES
@@ -207,7 +213,7 @@
 # we only build/export the static archive (.a) if generating a dev package
 if( DEV_PKG )
 	add_library( ricxfcpp_static STATIC
-		"$<TARGET_OBJECTS:message_objects>;$<TARGET_OBJECTS:json_objects>;$<TARGET_OBJECTS:alarm_objects>;$<TARGET_OBJECTS:config_objects>;$<TARGET_OBJECTS:metrics_objects>;$<TARGET_OBJECTS:xapp_objects>"
+		"$<TARGET_OBJECTS:message_objects>;$<TARGET_OBJECTS:json_objects>;$<TARGET_OBJECTS:alarm_objects>;$<TARGET_OBJECTS:config_objects>;$<TARGET_OBJECTS:metrics_objects>;$<TARGET_OBJECTS:xapp_objects>;$<TARGET_OBJECTS:model_objects>;$<TARGET_OBJECTS:rest-client_objects>;$<TARGET_OBJECTS:rest-server_objects>"
 	)
 	set_target_properties( ricxfcpp_static
 		PROPERTIES
@@ -282,3 +288,4 @@
 
 	INCLUDE( CPack )
 ENDIF()
+
diff --git a/Dockerfile b/Dockerfile
index b979228..e43a578 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -58,6 +58,56 @@
 COPY ${SRC}/build_rmr.sh /playpen/bin
 RUN bash /playpen/bin/build_rmr.sh -t ${RMR_VER}
 
+#building cpprestsdk
+RUN apt-get install -y libcpprest-dev
+
+RUN apt-get install -y  g++ git libboost-atomic-dev libboost-thread-dev libboost-system-dev libboost-date-time-dev libboost-regex-dev libboost-filesystem-dev libboost-random-dev libboost-chrono-dev libboost-serialization-dev libwebsocketpp-dev openssl libssl-dev ninja-build zlib1g-dev
+
+RUN git clone https://github.com/Microsoft/cpprestsdk.git casablanca && \
+    cd casablanca && \
+    mkdir build && \
+    cd build && \
+    cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF -DBUILD_SAMPLES=OFF -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
+    ninja && \
+    ninja install && \
+    cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=0 -DBUILD_TESTS=OFF -DBUILD_SAMPLES=OFF -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
+    ninja && \
+    ninja install && \
+    rm -rf casablanca
+#installing all dependicies for pistache
+RUN apt-get update && apt-get install -y cmake gcc make \
+git g++ wget meson libcurl4-openssl-dev libssl-dev pkg-config ninja-build
+
+ RUN git clone https://github.com/Tencent/rapidjson && \
+      cd rapidjson && \
+     mkdir build && \
+     cd build && \
+    cmake -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
+   make install && \
+    cd ../../
+        #rm -rf rapidjson
+
+#building and installing pistache
+RUN git clone https://github.com/pistacheio/pistache.git
+RUN cd pistache && \
+        meson setup build \
+    --buildtype=release \
+    -DPISTACHE_USE_SSL=true \
+    -DPISTACHE_BUILD_EXAMPLES=true \
+    -DPISTACHE_BUILD_TESTS=true \
+    -DPISTACHE_BUILD_DOCS=false \
+    --prefix="/usr/local"
+RUN cd pistache/build && \
+        ninja && \
+        ninja install
+RUN cp /usr/local/lib/x86_64-linux-gnu/libpistache* /usr/local/lib/
+RUN cp /usr/local/lib/x86_64-linux-gnu/pkgconfig/libpistache.pc /usr/local/lib/pkgconfig
+
+#install nlohmann json
+RUN git clone https://github.com/nlohmann/json.git && cd json && cmake . && make install
+
+#install json-schema-validator
+RUN git clone https://github.com/pboettch/json-schema-validator.git && cd json-schema-validator &&mkdir build &&cd build && cmake .. && make install
 
 #copy the content as git repo inside the container.
 #COPY ${SRC}/CMakeLists.txt /playpen/factory/
@@ -84,24 +134,28 @@
 
 
 # -----  final, smaller image ----------------------------------
-FROM ubuntu:20.04
-
+#FROM ubuntu:20.04
+FROM nexus3.o-ran-sc.org:10002/o-ran-sc/bldr-ubuntu20-c-go:1.0.0
 # must add compile tools to make it a builder environmnent. If a build environment isn't needed 
 # comment out the next line and reduce the image size by more than 180M.
 #
 RUN apt-get update && apt-get install -y --no-install-recommends make g++
 
 # if bash doesn't cut it for run_replay grab a real shell and clean up as much as we can
-RUN apt-get update; apt-get install -y ksh
+#RUN apt-get update; apt-get install -y ksh
 RUN rm -fr /var/lib/apt/lists 
 
 RUN mkdir -p /usr/local/include/ricxfcpp
 COPY --from=buildenv /usr/local/lib /usr/local/lib/
 COPY --from=buildenv /usr/local/include/ricxfcpp /usr/local/include/ricxfcpp/
 COPY --from=buildenv /usr/local/include/rmr /usr/local/include/rmr/
+COPY --from=buildenv /usr/local/include/cpprest /usr/local/include/cpprest/
+COPY --from=buildenv /usr/local/include/pplx /usr/local/include/pplx/
+COPY --from=buildenv /usr/local/include/pistache /usr/local/include/pistache/
 
 ENV LD_LIBRARY_PATH=/usr/local/lib64:/usr/local/lib
 ENV C_INCLUDE_PATH=/usr/local/include
 WORKDIR /factory
 
 CMD [ "make" ]
+
diff --git a/src/model/ActionToBeSetup.cpp b/src/model/ActionToBeSetup.cpp
new file mode 100644
index 0000000..6bf6903
--- /dev/null
+++ b/src/model/ActionToBeSetup.cpp
@@ -0,0 +1,105 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"ActionToBeSetup.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json & j, ActionToBeSetup& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+			if (j.contains("ActionDefinition")) {
+				j.at("ActionDefinition").get_to(ref.ActionDefinition);
+			}
+			j.at("ActionID").get_to(ref.ActionID);
+			j.at("ActionType").get_to(ref.ActionType);
+			if (j.contains("SubsequentAction")) {
+				j.at("SubsequentAction").get_to(ref.m_SubsequentAction);
+			}
+			
+
+		}
+
+		void from_json(const nlohmann::json & j, std::vector<ActionToBeSetup>& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+
+			for (auto& element : j) {
+				ActionToBeSetup tmp;
+				tmp.validate_json(element);
+				for (auto& val : element.items())
+				{
+					if (val.key() == "ActionDefinition") {
+
+						tmp.ActionDefinition.assign(val.value().begin(), val.value().end());
+
+					}
+					else if (val.key() == "ActionID") {
+						tmp.ActionID = val.value();
+					}
+					else if (val.key() == "ActionType") {
+						tmp.ActionType = val.value();
+					}
+					else if (val.key() == "SubsequentAction") {
+						tmp.m_SubsequentAction.SubsequentActionType = val.value()["SubsequentActionType"];
+						tmp.m_SubsequentAction.TimeToWait = val.value()["TimeToWait"];
+					}
+
+
+				}
+				ref.push_back(tmp);
+			}
+
+		}
+		void to_json(nlohmann::json& j, const ActionToBeSetup& ref) {
+
+			j = nlohmann::json{
+				//{"ActionDefinition", ref.ActionDefinition},
+				{"ActionID", ref.ActionID},
+				{"ActionType", ref.ActionType}//,
+				//{"SubsequentAction", {{"SubsequentActionType",ref.m_SubsequentAction.SubsequentActionType},{"TimeToWait", ref.m_SubsequentAction.TimeToWait } }}
+			};
+			if (ref.ActionDefinition.size() > 0) {
+				j["ActionDefinition"] = ref.ActionDefinition;
+			}
+			if (ref.m_SubsequentAction.SubsequentActionType.length() > 0 && ref.m_SubsequentAction.TimeToWait.length() > 0) {
+				j["SubsequentAction"] = ref.m_SubsequentAction;
+			}
+
+		}
+
+		void to_json(nlohmann::json& j, const std::vector<ActionToBeSetup>& ref) {
+			/*
+			for (int i = 0; i < ref.size(); i++) {
+				nlohmann::json tmp;
+				tmp = nlohmann::json{
+				{"ActionDefinition", ref[i].ActionDefinition},
+				{"ActionID", ref[i].ActionID},
+				{"ActionType", ref[i].ActionType},
+				{"SubsequentAction", {{"SubsequentActionType",ref[i].m_SubsequentAction.SubsequentActionType},{"TimeToWait", ref[i].m_SubsequentAction.TimeToWait } }}
+				};
+				j.push_back(tmp);
+			}
+			*/
+			for (int i = 0; i < ref.size(); i++) {
+				nlohmann::json tmp;
+				to_json(tmp, ref[i]);
+				j.push_back(tmp);
+			}
+		}
+	}
+}
diff --git a/src/model/ActionToBeSetup.h b/src/model/ActionToBeSetup.h
new file mode 100644
index 0000000..2dd8e9c
--- /dev/null
+++ b/src/model/ActionToBeSetup.h
@@ -0,0 +1,85 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef _ActionToBeSetupList_H
+#define _ActionToBeSetupList_H
+#include"SubsequentAction.h"
+
+namespace xapp
+{
+	namespace model
+	{
+		struct ActionToBeSetup: public ModelBase
+		{
+			int ActionID{0};
+			std::string ActionType{""};
+			//std::string SubsequentActionType{""};
+			//std::string TimeToWait{""};
+			SubsequentAction m_SubsequentAction; 
+			std::vector<int> ActionDefinition{};
+
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "ActionToBeSetup",
+			"properties": {
+			    "ActionDefinition": {
+			        "description": "Action Definition",
+			        "type": "array",
+			        "items": {
+			            "type": "integer"
+			        }
+			    },
+			    "ActionID": {
+			        "description": "Identification of Action",
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 255
+			    },
+			    "ActionType": {
+			        "description": "Type of Action",
+			        "type": "string",
+			        "enum": ["policy", "insert", "report"]
+			    },
+			    "SubsequentAction": {
+			        "description": "Subsequent Action",
+			        "type": "object"
+			    }
+			},
+			"required": [
+			             "ActionID",
+			             "ActionType"
+			            ],
+			"type": "object"
+			})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+
+		};
+
+		void from_json(const nlohmann::json & j, ActionToBeSetup& ref);
+		void from_json(const nlohmann::json & j, std::vector<ActionToBeSetup>& ref);
+		void to_json(nlohmann::json& j, const ActionToBeSetup& ref);
+		void to_json(nlohmann::json& j, const std::vector<ActionToBeSetup>& ref);
+
+	}
+	
+}
+
+
+#endif
+
diff --git a/src/model/CMakeLists.txt b/src/model/CMakeLists.txt
new file mode 100644
index 0000000..1d61af0
--- /dev/null
+++ b/src/model/CMakeLists.txt
@@ -0,0 +1,47 @@
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
+set(CMAKE_CXX_STANDARD 17)
+# BUILD TYPE
+message("A ${CMAKE_BUILD_TYPE} build configuration is detected")
+message("CPP flag is  ${CMAKE_CXX_FLAGS} ")
+message("CPP standard is  ${CMAKE_CXX_STANDARD} ")
+
+include_directories( "${srcd}/src/model")
+#SOURCE FILES
+file(GLOB SOURCE_FILES  "${srcd}/src/model/*.cpp" )
+
+
+add_library(model_objects OBJECT  ${SOURCE_FILES})
+
+target_include_directories (model_objects PUBLIC
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+        $<INSTALL_INTERFACE:include>
+        PRIVATE src)
+
+# header files should go into .../include/xfcpp/
+
+file(GLOB SOURCE_INSTALL_FILES  "${srcd}/src/model/*.h")
+#set( install_inc_client "include/ricxfcpp/rest-client" )
+
+if( DEV_PKG )
+        install( FILES
+                 ${SOURCE_INSTALL_FILES}
+                DESTINATION ${install_inc}
+        )
+endif()
+
+
diff --git a/src/model/ConfigMetadata.cpp b/src/model/ConfigMetadata.cpp
new file mode 100644
index 0000000..503e7d0
--- /dev/null
+++ b/src/model/ConfigMetadata.cpp
@@ -0,0 +1,37 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"ConfigMetadata.h"
+namespace xapp {
+	namespace model {
+
+		void from_json(const nlohmann::json& j, ConfigMetadata& ref) {
+
+			std::cout << __func__ << " ConfigMetadata " << std::endl;
+			ref.validate_json(j);
+			j.at("configType").get_to(ref.ConfigType);
+			j.at("xappName").get_to(ref.XappName);
+		}
+
+		void to_json(nlohmann::json& j, const ConfigMetadata& ref) {
+			j = nlohmann::json{
+				{"configType",ref.ConfigType},
+				{"xappName", ref.XappName}
+			};
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/ConfigMetadata.h b/src/model/ConfigMetadata.h
new file mode 100644
index 0000000..465ac05
--- /dev/null
+++ b/src/model/ConfigMetadata.h
@@ -0,0 +1,58 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_ConfigMetadata_H
+#define XAPP_MODEL_ConfigMetadata_H
+
+#include "ModelBase.h"
+
+namespace xapp {
+	namespace model {
+
+		struct ConfigMetadata : public ModelBase {
+			std::string ConfigType;
+			std::string XappName;
+			nlohmann::json validator_schema = R"(
+				{
+				"$schema": "http://json-schema.org/draft-07/schema#",
+				"title": "ConfigMetadata",
+				"properties": {
+				    "configType": {
+				        "description": "Type of Config",
+				        "type": "string",
+				        "enum": ["json", "xml", "other"]
+				    },
+				    "xappName": {
+				        "description": "Name of xApp",
+				        "type": "string"
+				    }
+				},
+				"required": [
+				             "ConfigType",
+				             "XappName"
+				             ],
+				"type": "object"
+				})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+		void from_json(const nlohmann::json& j, ConfigMetadata& ref);
+		void to_json(nlohmann::json& j, const ConfigMetadata& ref);
+
+	} /*namespace model*/
+} /*namespace xapp*/
+#endif /*XAPP_MODEL_ConfigMetadata_H*/
diff --git a/src/model/Dockerfile b/src/model/Dockerfile
new file mode 100644
index 0000000..9b275c4
--- /dev/null
+++ b/src/model/Dockerfile
@@ -0,0 +1,16 @@
+FROM nexus3.o-ran-sc.org:10001/ubuntu:18.04
+RUN apt-get update && apt-get install -y cmake
+
+RUN apt-get install -y libcpprest-dev
+
+RUN apt-get install -y  g++ git libboost-atomic-dev libboost-thread-dev libboost-system-dev libboost-date-time-dev libboost-regex-dev libboost-filesystem-dev libboost-random-dev libboost-chrono-dev libboost-serialization-dev libwebsocketpp-dev openssl libssl-dev ninja-build zlib1g-dev
+RUN git clone https://github.com/Microsoft/cpprestsdk.git casablanca && \
+    cd casablanca && \
+    mkdir build && \
+    cd build && \
+    cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF -DBUILD_SAMPLES=OFF -DCMAKE_INSTALL_PREFIX=/usr/local .. && \
+    ninja && \
+    ninja install
+RUN git clone https://github.com/nlohmann/json.git && cd json && cmake . && make install
+RUN git clone https://github.com/pboettch/json-schema-validator.git && cd json-schema-validator &&mkdir build &&cd build && cmake .. && make install
+COPY . ./
diff --git a/src/model/ModelBase.h b/src/model/ModelBase.h
new file mode 100644
index 0000000..2dfe3fc
--- /dev/null
+++ b/src/model/ModelBase.h
@@ -0,0 +1,63 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef _CleintModelBase_H
+#define _CleintModelBase_H
+#include<nlohmann/json.hpp>
+#include <nlohmann/json-schema.hpp>
+#include <type_traits>
+#include<vector>
+#include<string>
+#include<iostream>
+#include<limits.h>
+#include"temperory.h"
+namespace xapp
+{
+	namespace model
+	{
+		struct ModelBase {
+			nlohmann::json validator_schema = R"(
+			{
+			    "$schema": "http://json-schema.org/draft-07/schema#",
+			    "title": "ModelBase"
+			})"_json;
+
+
+
+			void validate_json(const nlohmann::json& _json) {
+				nlohmann::json_schema::json_validator validator;
+				validator.set_root_schema(get_validator_schema());
+				
+				try {
+					validator.validate(_json);
+				}
+				catch (const std::exception& e) {
+					throw;
+				}
+				
+				return;
+			}
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+
+	}
+
+}
+
+
+#endif
diff --git a/src/model/RestModel.h b/src/model/RestModel.h
new file mode 100644
index 0000000..9e18758
--- /dev/null
+++ b/src/model/RestModel.h
@@ -0,0 +1,34 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_H
+#define XAPP_MODEL_H
+#include "ModelBase.h"
+#include "SubsequentAction.h"
+#include "ActionToBeSetup.h"
+#include "SubscriptionResponse.h"
+#include "ConfigMetadata.h"
+#include "SubscriptionDetail.h"
+#include "SubscriptionParams_ClientEndpoint.h"
+#include "SubscriptionParams_E2SubscriptionDirectives.h"
+#include "SubscriptionParams.h"
+#include "SubscriptionInstance.h"
+#include "SubscriptionData.h"
+#include"SubscriptionDetail.h"
+#include"XAppConfig.h"
+//moved the implementation of model class into separate CPP file, in order to prevent ODR violation
+#endif
diff --git a/src/model/SubscriptionData.cpp b/src/model/SubscriptionData.cpp
new file mode 100644
index 0000000..b84c19c
--- /dev/null
+++ b/src/model/SubscriptionData.cpp
@@ -0,0 +1,121 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionData.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubscriptionData& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+			if (j.contains("SubscriptionId")) {
+				j.at("SubscriptionId").get_to(ref.SubscriptionID);
+			}
+			if (j.contains("SubscriptionInstances")) {
+				j.at("SubscriptionInstances").get_to(ref.m_SubscriptionInstances);
+			}
+			
+			if (j.contains("Meid")) {
+				j.at("Meid").get_to(ref.Meid);
+			}
+			
+			if (j.contains("ClientEndpoint")) {
+				j.at("ClientEndpoint").get_to(ref.ClientEndpoint);
+			}
+			
+		}
+
+		void from_json(const nlohmann::json& j, std::vector<SubscriptionData>& ref) {
+			for (auto& element : j) {
+				SubscriptionData tmp;
+				tmp.validate_json(element);
+				for (auto& val : element.items())
+				{
+					if (val.key() == "SubscriptionId") {
+						tmp.SubscriptionID = val.value();
+					}
+					else if (val.key() == "Meid") {
+						tmp.Meid = val.value();
+					}
+					else if (val.key() == "ClientEndpoint") {
+
+						tmp.ClientEndpoint.assign(val.value().begin(), val.value().end());
+					}
+					else if (val.key() == "SubscriptionInstances") {
+						from_json(val.value(), tmp.m_SubscriptionInstances);
+						/*
+						tmp.m_SubscriptionInstances.E2EventInstanceId= val.value()["E2EventInstanceId"];
+						tmp.m_SubscriptionInstances.XappEventInstanceId= val.value()["XappEventInstanceId"];
+						if (val.value().contains("ErrorCause"))
+						{
+							tmp.m_SubscriptionInstances.ErrorCause= val.value()["ErrorCause"];
+						}
+						if (val.value().contains("ErrorSource"))
+						{
+							tmp.m_SubscriptionInstances.ErrorCause = val.value()["ErrorSource"];
+						}
+						if (val.value().contains("TimeoutType"))
+						{
+							tmp.m_SubscriptionInstances.ErrorCause = val.value()["TimeoutType"];
+						}
+						*/
+
+					}
+				}
+				ref.push_back(tmp);
+			}
+
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionData& ref) {
+			/*
+			j = nlohmann::json{
+				{"SubscriptionId",ref.SubscriptionID},
+				{"Meid",ref.Meid},
+				{"ClientEndpoint", ref.ClientEndpoint}//,
+				//{"SubscriptionInstances", {{"XappEventInstanceId", ref.m_SubscriptionInstances.XappEventInstanceId},{"E2EventInstanceId", ref.m_SubscriptionInstances.E2EventInstanceId},{"ErrorCause", ref.m_SubscriptionInstances.ErrorCause},{"ErrorSource", ref.m_SubscriptionInstances.ErrorSource},{"TimeoutType", ref.m_SubscriptionInstances.TimeoutType}}}
+
+			};
+			nlohmann::json tmp_j;
+			to_json(tmp_j, ref.m_SubscriptionInstances);
+			j["SubscriptionInstances"] = tmp_j;
+			*/
+			if (ref.SubscriptionID != "") {
+				j["SubscriptionId"] = ref.SubscriptionID;
+			}
+			if (ref.Meid.length() > 0) {
+				j["Meid"] = ref.Meid;
+			}
+			if (ref.ClientEndpoint.size() > 0) {
+				j["ClientEndpoint"] = ref.ClientEndpoint;
+			}
+			if (ref.m_SubscriptionInstances.size() > 0) {
+				nlohmann::json tmp_j;
+				to_json(tmp_j, ref.m_SubscriptionInstances);
+				j["SubscriptionInstances"] = tmp_j;
+			}
+		}
+		void to_json(nlohmann::json& j, const std::vector<SubscriptionData>& ref) {
+			for (int i = 0; i < ref.size(); i++)
+			{
+				nlohmann::json tmp_j;
+				to_json(tmp_j, ref[i]);
+				j += tmp_j;
+			}
+		}
+	}
+}
diff --git a/src/model/SubscriptionData.h b/src/model/SubscriptionData.h
new file mode 100644
index 0000000..1848c97
--- /dev/null
+++ b/src/model/SubscriptionData.h
@@ -0,0 +1,66 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_SubscriptionData_H
+#define XAPP_MODEL_SubscriptionData_H
+#include "SubscriptionInstance.h"
+namespace xapp {
+	namespace model {
+
+		struct SubscriptionData : ModelBase {
+			std::vector<std::string> ClientEndpoint;
+			std::string Meid;
+			std::string SubscriptionID="";
+			std::vector<SubscriptionInstance> m_SubscriptionInstances;
+
+			nlohmann::json validator_schema = R"(
+				{
+				"$schema": "http://json-schema.org/draft-07/schema#",
+				"title": "SubscriptionData",
+				"properties": {
+				    "SubscriptionId": {
+				        "type": "string"
+				    },
+				    "Meid": {
+				        "type": "string"
+				    },
+				    "ClientEndpoint": {
+				        "type": "array",
+				        "items": {
+				            "type": "string"
+				        }
+				    },
+				    "SubscriptionInstances": {
+				        "type": "array"
+				    }
+				},
+				"type": "object"
+				})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+		void from_json(const nlohmann::json& j, SubscriptionData& ref);
+		void from_json(const nlohmann::json& j, std::vector<SubscriptionData>& ref);
+		void to_json(nlohmann::json& j, const SubscriptionData& ref);
+		void to_json(nlohmann::json& j, const std::vector<SubscriptionData>& ref);
+
+
+	} /*namespace model*/
+} /*namespace xapp*/
+#endif /*XAPP_MODEL_SubscriptionData_H*/
+
+
diff --git a/src/model/SubscriptionDetail.cpp b/src/model/SubscriptionDetail.cpp
new file mode 100644
index 0000000..4e62f8a
--- /dev/null
+++ b/src/model/SubscriptionDetail.cpp
@@ -0,0 +1,98 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionDetail.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubscriptionDetail& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+
+			j.at("XappEventInstanceId").get_to(ref.XappEventInstanceId);
+			j.at("EventTriggers").get_to(ref.EventTriggers);
+			j.at("ActionToBeSetupList").get_to(ref.Data);
+		}
+
+		void from_json(const nlohmann::json& j, std::vector<SubscriptionDetail>& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+
+
+			for (auto& element : j) {
+				SubscriptionDetail tmp;
+				tmp.validate_json(element);
+				for (auto& val : element.items()) {
+					if (val.key() == "XappEventInstanceId") {
+
+						//tmp.SetXappEventInstanceId(val.value());
+						tmp.XappEventInstanceId = val.value();
+
+					}
+					else if (val.key() == "EventTriggers") {
+						//tmp.setEventTriggers(val.value());
+						tmp.EventTriggers.assign(val.value().begin(), val.value().end());
+
+
+					}
+					else if (val.key() == "ActionToBeSetupList") {
+
+						nlohmann::json tmp_j(val.value());
+						from_json(tmp_j, tmp.Data);
+					}
+				}
+				ref.push_back(tmp);
+
+			}
+
+			/*
+			for (int i = 0; i < j.size(); i++)
+			{
+				ref[i].validate_json(j.at(i));
+				j.at(i).at("XappEventInstanceId").get_to(ref[i].XappEventInstanceId);
+				j.at(i).at("EventTriggers").get_to(ref[i].EventTriggers);
+				j.at(i).at("ActionToBeSetupList").get_to(ref[i].Data);
+			}
+			*/
+
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionDetail & ref) {
+
+			j = nlohmann::json{
+				{"XappEventInstanceId", ref.XappEventInstanceId},
+				{"EventTriggers", ref.EventTriggers}
+			};
+			nlohmann::json tmp_j;
+			to_json(tmp_j, ref.Data);
+			j["ActionToBeSetupList"] = tmp_j;
+			//for (int i = 0; i < ref.Data.size(); i++) {
+			//	nlohmann::json tmp_j;
+			//	to_json(tmp_j, ref.Data[i]);
+			//	j["ActionToBeSetupList"] += tmp_j;
+			//}
+		}
+		void to_json(nlohmann::json& j, const std::vector<SubscriptionDetail> & ref) {
+			for (int i = 0; i < ref.size(); i++)
+			{
+				nlohmann::json tmp_j;
+				to_json(tmp_j, ref[i]);
+				j += tmp_j;
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/SubscriptionDetail.h b/src/model/SubscriptionDetail.h
new file mode 100644
index 0000000..19b7fb9
--- /dev/null
+++ b/src/model/SubscriptionDetail.h
@@ -0,0 +1,76 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef _SubscriptionDetails_H
+#define _SubscriptionDetails_H
+#include"ActionToBeSetup.h"
+
+namespace xapp
+{
+	namespace model
+	{
+		struct SubscriptionDetail : public ModelBase
+		{
+			std::vector<ActionToBeSetup> Data;
+			int XappEventInstanceId{0};
+			std::vector<int> EventTriggers{};
+			friend void from_json(const nlohmann::json& j, SubscriptionDetail& ref);
+			friend void to_json(nlohmann::json& j, const SubscriptionDetail& ref);
+			friend void from_json(const nlohmann::json& j, std::vector<SubscriptionDetail>& ref);
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "Subscription detail",
+			"properties": {
+			    "XappEventInstanceId": {
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 255
+			    },
+			    "EventTriggers": {
+			        "description": "Identification of Action",
+			        "type": "array",
+			        "items": {
+			            "type": "integer"
+			        }
+			    },
+			    "ActionToBeSetupList": {
+			        "type": "array"
+			    }
+			},
+			"required": [
+			             "XappEventInstanceId",
+			             "EventTriggers",
+			             "ActionToBeSetupList"
+			            ],
+			"type": "object"
+			})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+			
+
+		};
+		void from_json(const nlohmann::json& j, SubscriptionDetail& ref);
+		void from_json(const nlohmann::json& j, std::vector<SubscriptionDetail>& ref);
+		void to_json(nlohmann::json& j, const SubscriptionDetail & ref);
+		void to_json(nlohmann::json& j, const std::vector<SubscriptionDetail> & ref);
+		
+
+	}
+}
+
+#endif
diff --git a/src/model/SubscriptionInstance.cpp b/src/model/SubscriptionInstance.cpp
new file mode 100644
index 0000000..3be4b20
--- /dev/null
+++ b/src/model/SubscriptionInstance.cpp
@@ -0,0 +1,97 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionInstance.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubscriptionInstance& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+
+			j.at("XappEventInstanceId").get_to(ref.XappEventInstanceId);
+			j.at("E2EventInstanceId").get_to(ref.E2EventInstanceId);
+			j.at("ErrorCause").get_to(ref.ErrorCause);
+			j.at("ErrorSource").get_to(ref.ErrorSource);
+			j.at("TimeoutType").get_to(ref.TimeoutType);
+		}
+		void from_json(const nlohmann::json& j, std::vector<SubscriptionInstance>& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			for (auto& element : j) {
+				SubscriptionInstance tmp;
+				tmp.validate_json(element);
+				for (auto& val : element.items())
+				{
+
+
+					if (val.key() == "XappEventInstanceId") {
+
+						tmp.XappEventInstanceId = val.value();
+
+					}
+					else if (val.key() == "E2EventInstanceId") {
+						tmp.E2EventInstanceId = val.value();
+					}
+					else if (val.key() == "ErrorCause") {
+						tmp.ErrorCause = val.value();
+					}
+					else if (val.key() == "ErrorSource") {
+						tmp.ErrorSource = val.value();
+					}
+					else if (val.key() == "TimeoutType") {
+						tmp.TimeoutType = val.value();
+					}
+
+
+				}
+				ref.push_back(tmp);
+
+
+			}
+
+
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionInstance& ref) {
+
+			j = nlohmann::json{
+				{"XappEventInstanceId", ref.XappEventInstanceId},
+				{"E2EventInstanceId", ref.E2EventInstanceId},
+				{"ErrorCause", ref.ErrorCause},
+				{"ErrorSource", ref.ErrorSource},
+				{"TimeoutType", ref.TimeoutType}
+			};
+		}
+		void to_json(nlohmann::json& j, const std::vector<SubscriptionInstance>& ref) {
+
+
+			for (int i = 0; i < ref.size(); i++)
+			{
+
+				nlohmann::json tmp = nlohmann::json{
+				{"XappEventInstanceId", ref[i].XappEventInstanceId},
+				{"E2EventInstanceId", ref[i].E2EventInstanceId},
+				{"ErrorCause", ref[i].ErrorCause},
+				{"ErrorSource", ref[i].ErrorSource},
+				{"TimeoutType", ref[i].TimeoutType}
+				};
+				j.push_back(tmp);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/SubscriptionInstance.h b/src/model/SubscriptionInstance.h
new file mode 100644
index 0000000..baff74f
--- /dev/null
+++ b/src/model/SubscriptionInstance.h
@@ -0,0 +1,81 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef SubscriptionInstance_H
+#define SubscriptionInstance_H
+#include"ModelBase.h"
+
+namespace xapp
+{
+	namespace model
+	{
+		struct SubscriptionInstance : public ModelBase
+		{
+		public:
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "SubscriptionInstance",
+			"description": "xApp service address and port",
+			"properties": {
+			    "XappEventInstanceId": {
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 65535
+			    },
+			    "E2EventInstanceId": {
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 65535
+			    },
+			    "ErrorCause": {
+			        "description": "Descriptive error cause. Empty string when no error.",
+			        "type": "string"
+			    },
+			    "ErrorSource": {
+			        "description": "Source of error cause.",
+			        "type": "string",
+			        "enum": ["SUBMGR", "RTMGR", "DBAAS", "ASN1", "E2Node"]
+			    },
+			    "TimeoutType": {
+			        "description": "Type timeout. xApp should retry if timeout occurs.",
+			        "type": "string",
+			        "enum": ["E2-Timeout", "RTMGR-Timeout", "DBAAS-Timeout"]
+			    }
+			},
+			"required": [
+			             "XappEventInstanceId",
+			             "E2EventInstanceId"
+			             ],
+			"type": "object"
+			})"_json;
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+			int XappEventInstanceId{ 0 };
+			int	E2EventInstanceId{ 0 };
+			std::string	ErrorCause{ "" };
+			std::string	ErrorSource{ "" };
+			std::string	TimeoutType{ "" };
+		};
+		void from_json(const nlohmann::json& j, SubscriptionInstance& ref);
+		void from_json(const nlohmann::json& j, std::vector<SubscriptionInstance>& ref);
+		void to_json(nlohmann::json& j, const SubscriptionInstance& ref);
+		void to_json(nlohmann::json& j, const std::vector<SubscriptionInstance>& ref);
+
+	}
+	
+}
+#endif
diff --git a/src/model/SubscriptionParams.cpp b/src/model/SubscriptionParams.cpp
new file mode 100644
index 0000000..0d5d938
--- /dev/null
+++ b/src/model/SubscriptionParams.cpp
@@ -0,0 +1,64 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionParams.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubscriptionParams& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+			j.at("ClientEndpoint").get_to(ref.ClientEndpoint);
+
+			if (j.contains("E2SubscriptionDirectives"))
+			{
+				j.at("E2SubscriptionDirectives").get_to(ref.E2SubscriptionDirectives);
+			}
+
+			if (j.contains("SubscriptionId"))
+			{
+				j.at("SubscriptionId").get_to(ref.SubscriptionId);
+			}
+
+			j.at("Meid").get_to(ref.Meid);
+			j.at("RANFunctionID").get_to(ref.RANFunctionID);
+			j.at("SubscriptionDetails").get_to(ref.Data);
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionParams& ref) {
+
+			j = nlohmann::json{
+				{"ClientEndpoint", ref.ClientEndpoint},
+				//{"E2SubscriptionDirectives", ref.E2SubscriptionDirectives},
+				{"Meid", ref.Meid},
+				{"RANFunctionID", ref.RANFunctionID},
+				{"SubscriptionId", ref.SubscriptionId}
+			};
+			if (ref.E2SubscriptionDirectives.E2RetryCount != INT_MIN && ref.E2SubscriptionDirectives.E2TimeoutTimerValue != INT_MIN) {
+				//nlohmann::json tmp_j;
+				//to_json(tmp_j, ref.E2SubscriptionDirectives);
+				//j["E2SubscriptionDirectives"] = tmp_j;
+				j["E2SubscriptionDirectives"] = ref.E2SubscriptionDirectives;
+			}
+			for (int i = 0; i < ref.Data.size(); i++) {
+				nlohmann::json tmp_j;
+				to_json(tmp_j, ref.Data[i]);
+				j["SubscriptionDetails"] += tmp_j;
+			}
+		}
+	}
+}
diff --git a/src/model/SubscriptionParams.h b/src/model/SubscriptionParams.h
new file mode 100644
index 0000000..0b65d0f
--- /dev/null
+++ b/src/model/SubscriptionParams.h
@@ -0,0 +1,85 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_SubscriptionParams_H
+#define XAPP_MODEL_SubscriptionParams_H
+#include"SubscriptionDetail.h"
+#include"SubscriptionParams_ClientEndpoint.h"
+#include"SubscriptionParams_E2SubscriptionDirectives.h"
+
+namespace xapp
+
+{
+	namespace model {
+
+		struct SubscriptionParams:public ModelBase {
+
+			std::string Host{ "" };
+			int HTTPPort{ 0 };
+			int RMRPort{ 0 };
+			SubscriptionParams_ClientEndpoint ClientEndpoint;
+			std::string Meid{ "" };
+			int RANFunctionID{ 0 };
+			std::string SubscriptionId{ "" };
+			std::vector<SubscriptionDetail> Data;
+			SubscriptionParams_E2SubscriptionDirectives E2SubscriptionDirectives;
+
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "SubscriptionParams",
+			"properties": {
+			    "SubscriptionId": {
+			        "description": "Optional subscription ID '(Submgr allocates if not given)'",
+			        "type": "string"
+			    },
+			    "Meid": {
+			        "type": "string"
+			    },
+			    "RANFunctionID": {
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 4095
+			    },
+				"ClientEndpoint":{
+					"type": "object"
+				},
+				"E2SubscriptionDirectives":{
+					"type": "object"
+				},
+				"SubscriptionDetails":{
+					"type": "array"
+				}
+			},
+			"required": [
+			             "ClientEndpoint",
+			             "Meid",
+			             "RANFunctionID",
+			             "SubscriptionDetails"
+			            ],
+			"type": "object"
+			})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+		void from_json(const nlohmann::json& j, SubscriptionParams& ref);
+		void to_json(nlohmann::json& j, const SubscriptionParams& ref);
+
+
+	}
+}
+#endif /*XAPP_MODEL_SubscriptionParams_H*/
diff --git a/src/model/SubscriptionParams_ClientEndpoint.cpp b/src/model/SubscriptionParams_ClientEndpoint.cpp
new file mode 100644
index 0000000..89d029d
--- /dev/null
+++ b/src/model/SubscriptionParams_ClientEndpoint.cpp
@@ -0,0 +1,38 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionParams_ClientEndpoint.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubscriptionParams_ClientEndpoint& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+			j.at("HTTPPort").get_to(ref.HTTPPort);
+			j.at("Host").get_to(ref.Host);
+			j.at("RMRPort").get_to(ref.RMRPort);
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionParams_ClientEndpoint& ref) {
+			j = nlohmann::json{
+				{"HTTPPort", ref.HTTPPort},
+				{"Host", ref.Host},
+				{"RMRPort", ref.RMRPort},
+			};
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/SubscriptionParams_ClientEndpoint.h b/src/model/SubscriptionParams_ClientEndpoint.h
new file mode 100644
index 0000000..0096c38
--- /dev/null
+++ b/src/model/SubscriptionParams_ClientEndpoint.h
@@ -0,0 +1,71 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_SubscriptionParams_ClientEndpoint_H
+#define XAPP_MODEL_SubscriptionParams_ClientEndpoint_H
+#include "ModelBase.h"
+#include"nlohmann/json.hpp"
+
+namespace xapp {
+	namespace model {
+
+		struct SubscriptionParams_ClientEndpoint :public ModelBase {
+			int HTTPPort;
+			std::string Host;
+			int RMRPort;
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "SubscriptionParams_ClientEndpoint",
+			"description": "xApp service address and port",
+			"properties": {
+			    "HTTPPort": {
+			        "description": "xApp HTTP service address port",
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 65535
+			    },
+			    "Host": {
+			        "description": "xApp service address name like service-ricxapp-xappname-http.ricxapp",
+			        "type": "string"
+			    },
+			    "RMRPort": {
+			        "description": "xApp RMR service address port",
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 65535
+			    }
+			},
+			"required": [
+			             "HTTPPort",
+			             "Host",
+			             "RMRPort"
+			             ],
+			"type": "object"
+			})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+
+		};
+		void from_json(const nlohmann::json& j, SubscriptionParams_ClientEndpoint& ref);
+		void to_json(nlohmann::json& j, const SubscriptionParams_ClientEndpoint& ref);
+
+		
+	} /*namespace model*/
+} /*namespace xapp*/
+#endif /*XAPP_MODEL_SubscriptionParams_ClientEndpoint_H*/
+
diff --git a/src/model/SubscriptionParams_E2SubscriptionDirectives.cpp b/src/model/SubscriptionParams_E2SubscriptionDirectives.cpp
new file mode 100644
index 0000000..cef5add
--- /dev/null
+++ b/src/model/SubscriptionParams_E2SubscriptionDirectives.cpp
@@ -0,0 +1,39 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionParams_E2SubscriptionDirectives.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubscriptionParams_E2SubscriptionDirectives& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+			j.at("E2RetryCount").get_to(ref.E2RetryCount);
+			j.at("E2TimeoutTimerValue").get_to(ref.E2TimeoutTimerValue);
+			j.at("RMRRoutingNeeded").get_to(ref.RMRRoutingNeeded);
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionParams_E2SubscriptionDirectives& ref) {
+
+			j = nlohmann::json{
+				{"E2RetryCount", ref.E2RetryCount},
+				{"E2TimeoutTimerValue", ref.E2TimeoutTimerValue},
+				{"RMRRoutingNeeded", ref.RMRRoutingNeeded},
+			};
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/SubscriptionParams_E2SubscriptionDirectives.h b/src/model/SubscriptionParams_E2SubscriptionDirectives.h
new file mode 100644
index 0000000..897acb3
--- /dev/null
+++ b/src/model/SubscriptionParams_E2SubscriptionDirectives.h
@@ -0,0 +1,70 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_SubscriptionParams_E2SubscriptionDirectives_H
+#define XAPP_MODEL_SubscriptionParams_E2SubscriptionDirectives_H
+#include"ModelBase.h"
+#include"nlohmann/json.hpp"
+
+namespace xapp {
+	namespace model {
+
+		struct SubscriptionParams_E2SubscriptionDirectives : public ModelBase {
+
+			int E2RetryCount=INT_MIN;
+			int E2TimeoutTimerValue=INT_MIN;
+			bool RMRRoutingNeeded;
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "SubscriptionParams_E2SubscriptionDirectives",
+			"description": "Optional. If not set Submgr uses its default values",
+			"properties": {
+			    "E2RetryCount": {
+			        "description": "How many times E2 subscription request is retried",
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 10
+			    },
+			    "E2TimeoutTimerValue": {
+			        "description": "How long time response is waited from E2 node",
+			        "type": "integer",
+			        "minimum": 0,
+			        "maximum": 10
+			    },
+			    "RMRRoutingNeeded": {
+			        "description": "Subscription needs RMR route from E2Term to xApp",
+			        "type": "boolean"
+			    }
+			},
+			"required": [
+			             "E2TimeoutTimerValue",
+			             "E2RetryCount",
+			             "RMRRoutingNeeded"
+			            ],
+			"type": "object"
+			})"_json;
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+		
+		void from_json(const nlohmann::json& j, SubscriptionParams_E2SubscriptionDirectives& ref);
+		void to_json(nlohmann::json& j, const SubscriptionParams_E2SubscriptionDirectives& ref);
+
+		
+	} /*namespace model*/
+} /*namespace xapp*/
+#endif /*XAPP_MODEL_SubscriptionParams_ClientEndpoint_H*/
diff --git a/src/model/SubscriptionResponse.cpp b/src/model/SubscriptionResponse.cpp
new file mode 100644
index 0000000..d651e92
--- /dev/null
+++ b/src/model/SubscriptionResponse.cpp
@@ -0,0 +1,52 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubscriptionResponse.h"
+namespace xapp {
+	namespace model {
+		void from_json(const  nlohmann::json& j, SubscriptionResponse& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+
+			j.at("SubscriptionId").get_to(ref.SubscriptionId);
+			j.at("SubscriptionInstances").get_to(ref.SubInst);
+		}
+
+		void to_json(nlohmann::json& j, const SubscriptionResponse& ref) {
+
+			//j = nlohmann::json{
+			//	{"SubscriptionId",ref.SubscriptionId},
+			//	{"SubscriptionInstances", ref.SubInst}
+			//};
+			j = nlohmann::json{
+				{"SubscriptionId",ref.SubscriptionId}
+			};
+			for (int i = 0; i < ref.SubInst.size(); i++)
+			{
+				j["SubscriptionInstances"] += nlohmann::json{
+				{"XappEventInstanceId", ref.SubInst[i].XappEventInstanceId},
+				{"E2EventInstanceId", ref.SubInst[i].E2EventInstanceId},
+				{"ErrorCause", ref.SubInst[i].ErrorCause},
+				{"ErrorSource", ref.SubInst[i].ErrorSource},
+				{"TimeoutType", ref.SubInst[i].TimeoutType}
+				};
+			}
+
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/SubscriptionResponse.h b/src/model/SubscriptionResponse.h
new file mode 100644
index 0000000..d6b93ab
--- /dev/null
+++ b/src/model/SubscriptionResponse.h
@@ -0,0 +1,59 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_SubscriptionResponse_H
+#define XAPP_MODEL_SubscriptionResponse_H
+#include"SubscriptionInstance.h"
+namespace xapp
+{
+	namespace model {
+		struct SubscriptionResponse:public ModelBase
+		{
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "SubscriptionResponse",
+			"properties": {
+			    "SubscriptionId": {
+			        "description": "Indentification of Subscription",
+			        "type": "integer"
+			    },
+			    "SubscriptionInstances": {
+			        "description": "List of Subscription Instance",
+			        "type": "array"
+			    }
+			},
+			"required": [
+			             "SubscriptionId",
+			             "SubscriptionInstances"
+			             ],
+			"type": "object"
+			})"_json;
+
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+			std::string SubscriptionId{ "" };
+			std::vector<SubscriptionInstance > SubInst;
+
+		};
+		void from_json(const  nlohmann::json& j, SubscriptionResponse& ref);
+		void to_json(nlohmann::json& j, const SubscriptionResponse& ref);
+
+	}
+
+}
+#endif
+
diff --git a/src/model/SubsequentAction.cpp b/src/model/SubsequentAction.cpp
new file mode 100644
index 0000000..d646ffa
--- /dev/null
+++ b/src/model/SubsequentAction.cpp
@@ -0,0 +1,38 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"SubsequentAction.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, SubsequentAction& ref) {
+
+			std::cout << __PRETTY_FUNCTION__ << "\n";
+			ref.validate_json(j);
+
+			j.at("SubsequentActionType").get_to(ref.SubsequentActionType);
+			j.at("TimeToWait").get_to(ref.TimeToWait);
+		}
+
+		void to_json(nlohmann::json& j, const SubsequentAction& ref) {
+
+			j = nlohmann::json{
+				{"SubsequentActionType",ref.SubsequentActionType},
+				{"TimeToWait", ref.TimeToWait}
+			};
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/SubsequentAction.h b/src/model/SubsequentAction.h
new file mode 100644
index 0000000..3ffa29d
--- /dev/null
+++ b/src/model/SubsequentAction.h
@@ -0,0 +1,62 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef SubsequentAction_H
+#define SubsequentAction_H
+#include"ModelBase.h"
+namespace xapp
+{
+	namespace model
+	{
+		struct SubsequentAction : public ModelBase {
+			std::string SubsequentActionType;
+			std::string TimeToWait;
+			nlohmann::json validator_schema = R"(
+			{
+			"$schema": "http://json-schema.org/draft-07/schema#",
+			"title": "SubsequentAction",
+			"properties": {
+			    "SubsequentActionType": {
+			        "description": "Type of Subsequent Action",
+			        "type": "string",
+			        "enum": ["wait", "continue"]
+
+			    },
+			    "TimeToWait": {
+			        "description": "Time to waiting",
+			        "type": "string",
+			        "enum": ["zero", "w1ms", "w2ms", "w5ms", "w10ms", "w20ms", "w30ms",
+			                "w40ms", "w50ms", "w100ms", "w200ms", "w500ms", "w1s",
+			                "w2s", "w5s", "w10s", "w20s", "w60s"]
+			    }
+			},
+			"required": [
+			             "SubsequentActionType",
+			             "TimeToWait"
+			             ],
+			"type": "object"
+			})"_json;
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+		void from_json(const nlohmann::json& j, SubsequentAction& ref);
+		void to_json(nlohmann::json& j, const SubsequentAction& ref);
+
+	}
+	
+}
+
+#endif
diff --git a/src/model/XAppConfig.cpp b/src/model/XAppConfig.cpp
new file mode 100644
index 0000000..a5402db
--- /dev/null
+++ b/src/model/XAppConfig.cpp
@@ -0,0 +1,62 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"XAppConfig.h"
+namespace xapp {
+	namespace model {
+		void from_json(const nlohmann::json& j, XAppConfig& ref) {
+			std::cout << __PRETTY_FUNCTION__ << std::endl;
+			ref.validate_json(j);
+			j.at("metadata").get_to(ref.m_ConfigMetadata);
+			j.at("config").get_to(ref.config);
+
+		}
+		void from_json(const nlohmann::json& j, std::vector<XAppConfig>& ref) {
+			for (auto& element : j) {
+				XAppConfig tmp;
+				tmp.validate_json(element);
+				for (auto& val : element.items())
+				{
+					if (val.key() == "metadata") {
+						tmp.m_ConfigMetadata.ConfigType = val.value()["configType"];
+						tmp.m_ConfigMetadata.XappName = val.value()["xappName"];
+					}
+					else if (val.key() == "config") {
+						tmp.config = val.value();
+					}
+				}
+				ref.push_back(tmp);
+			}
+		}
+
+		void to_json(nlohmann::json& j, const XAppConfig& ref) {
+			j = nlohmann::json{
+				{"metadata",{{"configType",ref.m_ConfigMetadata.ConfigType},{"xappName",ref.m_ConfigMetadata.XappName}}},
+				{"config",ref.config}
+			};
+		}
+
+		void to_json(nlohmann::json& j, const std::vector<XAppConfig>& ref) {
+			for (int i = 0; i < ref.size(); i++)
+			{
+				nlohmann::json tmp_j;
+				to_json(tmp_j, ref[i]);
+				j += tmp_j;
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/src/model/XAppConfig.h b/src/model/XAppConfig.h
new file mode 100644
index 0000000..5f8a8b0
--- /dev/null
+++ b/src/model/XAppConfig.h
@@ -0,0 +1,55 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef XAPP_MODEL_XAppConfig_H
+#define XAPP_MODEL_XAppConfig_H
+#include"ConfigMetadata.h"
+
+namespace xapp {
+	namespace model {
+		struct  XAppConfig : public ModelBase {
+			ConfigMetadata m_ConfigMetadata;
+			nlohmann::json config;// = nlohmann::json::object();
+			nlohmann::json validator_schema = R"(
+				{
+				"$schema": "http://json-schema.org/draft-07/schema#",
+				"title": "XAppConfig",
+				"properties": {
+				    
+				    "metadata": {
+				        "type": "object"
+				    },
+					 "config": {
+				        "type": "object"
+				    }
+				},
+				"required": [
+				             "metadata",
+							 "config"
+				             ],
+				"type": "object"
+				})"_json;
+			virtual nlohmann::json get_validator_schema() const { return validator_schema; }
+		};
+		void from_json(const nlohmann::json& j, XAppConfig& ref);
+		void from_json(const nlohmann::json& j, std::vector<XAppConfig>& ref);
+		void to_json(nlohmann::json& j, const XAppConfig& ref);
+		void to_json(nlohmann::json& j, const std::vector<XAppConfig>& ref);
+
+	}
+}
+#endif
diff --git a/src/model/temperory.h b/src/model/temperory.h
new file mode 100644
index 0000000..e5b1a92
--- /dev/null
+++ b/src/model/temperory.h
@@ -0,0 +1,21 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#pragma once
+#if !defined(__PRETTY_FUNCTION__) && !defined(__GNUC__)
+#define __PRETTY_FUNCTION__ __FUNCSIG__
+#endif
diff --git a/src/rest-client/CMakeLists.txt b/src/rest-client/CMakeLists.txt
new file mode 100644
index 0000000..595485a
--- /dev/null
+++ b/src/rest-client/CMakeLists.txt
@@ -0,0 +1,47 @@
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
+set(CMAKE_CXX_STANDARD 17)
+# BUILD TYPE
+message("A ${CMAKE_BUILD_TYPE} build configuration is detected")
+message("CPP flag is  ${CMAKE_CXX_FLAGS} ")
+message("CPP standard is  ${CMAKE_CXX_STANDARD} ")
+
+include_directories( "${srcd}/src/rest-client")
+#SOURCE FILES
+file(GLOB SOURCE_FILES  "${srcd}/src/rest-client/*.cpp" )
+
+
+add_library(rest-client_objects OBJECT  ${SOURCE_FILES})
+
+target_include_directories (rest-client_objects PUBLIC
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+        $<INSTALL_INTERFACE:include>
+        PRIVATE src)
+
+# header files should go into .../include/xfcpp/
+
+file(GLOB SOURCE_INSTALL_FILES  "${srcd}/src/rest-client/*.h")
+#set( install_inc_client "include/ricxfcpp/rest-client" )
+
+if( DEV_PKG )
+        install( FILES
+                 ${SOURCE_INSTALL_FILES}
+                DESTINATION ${install_inc}
+        )
+endif()
+
+
diff --git a/src/rest-client/RestClient.cpp b/src/rest-client/RestClient.cpp
new file mode 100644
index 0000000..12c8728
--- /dev/null
+++ b/src/rest-client/RestClient.cpp
@@ -0,0 +1,422 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"RestClient.h"
+namespace xapp
+{
+	void cpprestclient::SetbaseUrl(std::string url)
+	{
+		this->baseUrl = utility::conversions::to_string_t(url);
+		this->Baseurl = url;
+	}
+	cpprestclient::cpprestclient(std::string base_url) {
+		this->baseUrl = utility::conversions::to_string_t(base_url);
+		this->Baseurl = base_url;
+	}
+	cpprestclient::cpprestclient(std::string base_url, std::function<void(web::http::http_request)>callback):listener{ utility::conversions::to_string_t(resp_url) }
+	{
+		this->baseUrl= utility::conversions::to_string_t(base_url);
+		this->Baseurl = base_url;
+		try
+		{
+			listener.support(web::http::methods::POST, [callback](web::http::http_request request) { callback(request); });
+			ok_2_run = true;
+                        /*
+                        ok_2_run = true;
+                        t = new std::thread*[1];
+                        t[0] = new std::thread(&cpprestclient::response_listener, this);
+                        t[0]->detach();
+                        */
+                        response_listener();
+
+			
+		}
+		catch (std::exception const & e)
+		{
+			std::wcout << e.what() << std::endl;
+		}
+
+	}
+	cpprestclient::cpprestclient(std::string base_url,std::string response_url, std::function<void(web::http::http_request)>callback):listener{ utility::conversions::to_string_t(response_url) }{
+		
+		this->baseUrl= utility::conversions::to_string_t(base_url);
+                this->Baseurl = base_url;
+                try
+                {
+                        listener.support(web::http::methods::POST, [callback](web::http::http_request request) { callback(request); });
+                        /*
+                        ok_2_run = true;
+                        t = new std::thread*[1];
+                        t[0] = new std::thread(&cpprestclient::response_listener, this);
+                        t[0]->detach();
+                        */
+                        response_listener();
+
+
+
+                }
+                catch (std::exception const & e)
+                {
+                        std::wcout << e.what() << std::endl;
+                }
+
+
+
+	}
+
+	/*
+	void cpprestclient::start_response_listener() {
+		try {
+			t[0] = new std::thread(&cpprestclient::response_listener, this);
+			t[0]->detach();
+		}
+		catch (std::exception const & e)
+		{
+			std::wcout << e.what() << std::endl;
+		}
+	}
+	*/
+	std::string cpprestclient::getBaseUrl()
+	{
+		return Baseurl;
+	}
+	void cpprestclient::response_listener() {
+		try
+		{
+			this->listener.open().wait();
+			//std::cout<<"kumar "<<"\n";
+			//std::this_thread::sleep_for(std::chrono::seconds(20));
+                       /*
+			while (ok_2_run) {
+				//std::cout<<"sandeeep ";
+
+			}
+                        */
+
+		}
+		catch (std::exception const & e)
+		{
+			std::wcout << e.what() << std::endl;
+		}
+	}
+	void cpprestclient::stop_response_listener() {
+		try
+		{
+			ok_2_run = false;
+			listener.close();
+			//delete[] t;
+			std::cout << "\nclosed1\n";
+		}
+		catch (std::exception const & e)
+		{
+			std::wcout << e.what() << std::endl;
+		}
+	}
+	oresponse_t cpprestclient::post_subscriptions(const nlohmann::json & json, std::string path) {
+		oresponse_t res;
+		res.status_code = 0;
+		res.SubscriptionId = "";
+		auto postJson = pplx::create_task([&]() {
+			utility::stringstream_t s;
+			s << json.dump().c_str();
+			web::json::value sdk_json = web::json::value::parse(s);
+			web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
+			auto addr = uri.to_uri().to_string();
+			web::http::client::http_client client(addr);
+			return client.request(web::http::methods::POST, U("/"), sdk_json.serialize(), U("application/json"));
+		})
+			.then([&](web::http::http_response response) {
+
+			res.status_code = response.status_code();
+			if (response.status_code() != 201) {
+				throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+			}
+			ucout << response.to_string() << "\n";
+			response.headers().set_content_type(U("application/json"));
+			return response.extract_json();
+		})
+
+			.then([&](web::json::value jsonObject) {
+			res.SubscriptionId = utility::conversions::to_utf8string(jsonObject[U("SubscriptionId")].as_string());
+
+			//validating subscription response against its schema
+			std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
+			nlohmann::json  j= nlohmann::json::parse(s);
+			xapp::model::SubscriptionResponse SResp;
+			xapp::model::from_json(j, SResp);
+			
+			//sanity check
+			nlohmann::json ans;
+			xapp::model::to_json(ans, SResp);
+			std::cout << ans.dump(4) << "\n";
+
+		});
+		try {
+			postJson.wait();
+		}
+		catch (const std::exception& e) {
+			
+			printf("Error exception:%s\n", e.what());
+		}
+		return res;
+
+	}
+	int  cpprestclient::delete_subscriptions(std::string Id, std::string path)
+	{
+		int status_code=0;
+		auto delJson = pplx::create_task([&]() {
+			web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
+			auto addr = uri.to_uri().to_string();
+			web::http::client::http_client client(addr);
+			addr.append(utility::conversions::to_string_t(Id));
+			//ucout << utility::string_t(U("making requests at: ")) << addr << std::endl;
+			return client.request(web::http::methods::DEL);
+		})
+
+
+			.then([&](web::http::http_response response) {
+			status_code = response.status_code();
+			if (response.status_code() != 204) {
+				throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+			}
+		});
+
+		try {
+			delJson.wait();
+		}
+		catch (const std::exception& e) {
+			printf("Error exception:%s\n", e.what());
+		}
+
+		return status_code;
+	}
+	response_t  cpprestclient::get_config(std::string path)
+	{
+		response_t res;
+		res.status_code = 0;
+		res.body = utility::conversions::to_string_t("");
+		auto postJson = pplx::create_task([&]() {
+
+
+			web::http::client::http_client client(this->baseUrl);
+
+
+			return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string());
+		})
+			.then([&](web::http::http_response response) {
+
+			res.status_code = response.status_code();
+			if (response.status_code() != 200) {
+				throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+			}
+			ucout << response.to_string() << "\n";
+			response.headers().set_content_type(U("application/json"));
+			return response.extract_json();
+		})
+
+			.then([&](web::json::value jsonObject) {
+			//validating configlist against its schema
+			std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
+			res.body = nlohmann::json::parse(s);
+			std::vector<xapp::model::XAppConfig> cfg;
+			xapp::model::from_json(res.body, cfg);
+			
+			//sanity check
+			nlohmann::json ans;
+			xapp::model::to_json(ans, cfg);
+			std::cout << ans.dump(4) << "\n";
+		});
+		try {
+			postJson.wait();
+		}
+		catch (const std::exception& e) {
+			printf("Error exception:%s\n", e.what());
+		}
+		return res;
+	}
+	response_t  cpprestclient::get_subscriptions(std::string path)
+	{
+		response_t res;
+		res.status_code = 0;
+		res.body = utility::conversions::to_string_t("");
+		auto postJson = pplx::create_task([&]() {
+
+
+			web::http::client::http_client client(this->baseUrl);
+
+
+			return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string());
+		})
+			.then([&](web::http::http_response response) {
+
+			res.status_code = response.status_code();
+			if (response.status_code() != 200) {
+				throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+			}
+			ucout << response.to_string() << "\n";
+			response.headers().set_content_type(U("application/json"));
+			return response.extract_json();
+		})
+
+			.then([&](web::json::value jsonObject) {
+
+			//validating subscription list  against its schema
+			std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
+			res.body = nlohmann::json::parse(s);
+			std::vector<xapp::model::SubscriptionData> subList;
+			xapp::model::from_json(res.body, subList);
+
+			//sanity check
+			nlohmann::json ans;
+			xapp::model::to_json(ans, subList);
+			std::cout << ans.dump(4) << "\n";
+
+		});
+		try {
+			postJson.wait();
+		}
+		catch (const std::exception& e) {
+			printf("Error exception:%s\n", e.what());
+		}
+		return res;
+	}
+	response_t cpprestclient::do_post(const nlohmann::json & json, std::string path)
+	{
+		response_t res;
+		res.status_code = 0;
+		res.body = utility::conversions::to_string_t("");
+		auto postJson = pplx::create_task([&]() {
+			//conversion from nlhomann json to cpprestsdk json
+			utility::stringstream_t s;
+			s << json.dump().c_str();
+			web::json::value sdk_json = web::json::value::parse(s);
+			web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
+			auto addr = uri.to_uri().to_string();
+			web::http::client::http_client client(addr);
+			return client.request(web::http::methods::POST, U("/"), sdk_json.serialize(), U("application/json"));
+		})
+				.then([&](web::http::http_response response) {
+
+					res.status_code = response.status_code();
+					if (response.status_code() != 201) {
+					throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+					}
+					ucout << response.to_string() << "\n";
+					response.headers().set_content_type(U("application/json"));
+					return response.extract_json();
+			})
+				
+				.then([&](web::json::value jsonObject) {
+					//std::cout << "\nRecieved REST subscription response\n";
+					//std::wcout << jsonObject.serialize().c_str() << "\n";
+					//resp.body = jsonObject.serialize();
+
+				//conversion from cpprestsdk json to nlhomann json
+				std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
+				res.body = nlohmann::json::parse(s);
+			});
+			try {
+				postJson.wait();
+			}
+			catch (const std::exception& e) {
+				printf("Error exception:%s\n", e.what());
+			}
+			return res;
+	}
+	response_t cpprestclient::do_del(std::string Id, std::string path)
+	{
+		response_t res;
+		res.status_code = 0;
+		res.body = utility::conversions::to_string_t("");
+		auto delJson = pplx::create_task([&]() {
+			web::uri_builder uri(this->baseUrl + utility::conversions::to_string_t(path));
+			auto addr = uri.to_uri().to_string();
+			web::http::client::http_client client(addr);
+			addr.append(utility::conversions::to_string_t(Id));
+			//ucout << utility::string_t(U("making requests at: ")) << addr << std::endl;
+			return client.request(web::http::methods::DEL);
+		})
+
+			
+			.then([&](web::http::http_response response) {
+				res.status_code = response.status_code();
+				if (response.status_code() != 204) {
+					throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+				}
+				ucout << response.to_string() << "\n";
+				response.headers().set_content_type(U("application/json"));
+				return response.extract_json();
+				//std::wcout << "Deleted: " << std::boolalpha << (response.status_code() == 204) << std::endl;
+		})
+			.then([&](web::json::value jsonObject) {
+
+				//resp.body = jsonObject.serialize();
+			std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
+			res.body = nlohmann::json::parse(s);
+		});
+
+		try {
+			delJson.wait();
+		}
+		catch (const std::exception& e) {
+			printf("Error exception:%s\n", e.what());
+		}
+
+		return res;
+
+	}
+	 response_t cpprestclient::do_get(std::string path)
+	{
+		response_t res;
+		res.status_code = 0;
+		res.body = utility::conversions::to_string_t("");
+		auto postJson = pplx::create_task([&]() {
+
+
+			web::http::client::http_client client(this->baseUrl);
+
+			
+			return client.request(web::http::methods::GET, web::uri_builder(U("/")).append_path(utility::conversions::to_string_t(path)).to_string());
+		})
+			.then([&](web::http::http_response response) {
+
+			res.status_code = response.status_code();
+			if (response.status_code() != 200) {
+				throw std::runtime_error("Returned " + std::to_string(response.status_code()));
+			}
+			ucout << response.to_string() << "\n";
+			response.headers().set_content_type(U("application/json"));
+			return response.extract_json();
+		})
+
+			.then([&](web::json::value jsonObject) {
+	
+			//resp.body = jsonObject.serialize();
+			std::string s = utility::conversions::to_utf8string(jsonObject.serialize());
+			res.body = nlohmann::json::parse(s);
+		});
+		try {
+			postJson.wait();
+		}
+		catch (const std::exception& e) {
+			printf("Error exception:%s\n", e.what());
+		}
+		return res;
+	}
+}
+
+
diff --git a/src/rest-client/RestClient.h b/src/rest-client/RestClient.h
new file mode 100644
index 0000000..8368547
--- /dev/null
+++ b/src/rest-client/RestClient.h
@@ -0,0 +1,90 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef _CPPREST_SDK_WRAPPER_H
+#define _CPPREST_SDK_WRAPPER_H
+
+#include<string>
+#include<cpprest/http_client.h>
+#include<cpprest/filestream.h>
+#include<cpprest/uri.h>
+#include<cpprest/json.h>
+#include<sstream>
+#include <cpprest/http_listener.h>
+#include"nlohmann/json.hpp"
+#include<functional>
+#include"RestModel.h"
+#include<thread>
+#include <chrono>
+#include <pthread.h>
+
+
+namespace xapp
+{
+	typedef struct resp
+	{
+		long status_code;
+		nlohmann::json body;
+		//utility::string_t body;
+	}response_t;
+
+	typedef struct oran_resp
+	{
+		long status_code;
+		std::string SubscriptionId;
+	}oresponse_t;
+
+	class cpprestclient
+	{
+	protected:
+		utility::string_t baseUrl;
+		std::string Baseurl;
+		//utility::string_t resp_url=U("http://0.0.0.0:8080/ric/v1/subscriptions/response");
+		std::string resp_url = "http://0.0.0.0:8080/ric/v1/subscriptions/response";//default response url
+		web::http::experimental::listener::http_listener listener;
+		std::thread** t;
+		void response_listener();
+		bool ok_2_run;
+	public:
+		void SetbaseUrl(std::string);
+		std::string getBaseUrl();
+		//O-RAN specific api calls
+		oresponse_t post_subscriptions(const nlohmann::json & json, std::string path);
+		int delete_subscriptions(std::string Id, std::string path);
+		response_t get_subscriptions(std::string path);
+		response_t get_config(std::string path);
+
+		//general api calls
+		virtual response_t do_get(std::string path);
+		virtual response_t do_post(const nlohmann::json & json, std::string path);
+		virtual response_t do_del(std::string Id, std::string path);
+		//virtual response_t do_post(const web::json::value & json, std::string path);
+		cpprestclient(std::string base_url, std::function<void(web::http::http_request)>callback);
+		cpprestclient(std::string base_url,std::string response_url, std::function<void(web::http::http_request)>callback);
+		cpprestclient(std::string base_url);
+		virtual ~cpprestclient(){}
+		//void start_response_listener();
+		void stop_response_listener();
+	};
+
+}
+
+
+
+
+
+#endif
diff --git a/src/rest-server/CMakeLists.txt b/src/rest-server/CMakeLists.txt
new file mode 100644
index 0000000..5629496
--- /dev/null
+++ b/src/rest-server/CMakeLists.txt
@@ -0,0 +1,48 @@
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17")
+set(CMAKE_CXX_STANDARD 17)
+# BUILD TYPE
+message("A ${CMAKE_BUILD_TYPE} build configuration is detected")
+message("CPP flag is  ${CMAKE_CXX_FLAGS} ")
+message("CPP standard is  ${CMAKE_CXX_STANDARD} ")
+
+#include_directories( "${srcd}/src/rest-server")
+#SOURCE FILES
+file(GLOB SOURCE_FILES  "${srcd}/src/rest-server/*.cpp" )
+
+
+add_library(rest-server_objects OBJECT  ${SOURCE_FILES})
+
+target_include_directories (rest-server_objects PUBLIC
+        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+        $<INSTALL_INTERFACE:include>
+        PRIVATE src)
+
+# header files should go into .../include/xfcpp/
+
+file(GLOB SOURCE_INSTALL_FILES  "${srcd}/src/rest-server/*.h")
+#set( install_inc_server "include/ricxfcpp/rest-server" )
+
+if( DEV_PKG )
+        install( FILES
+                 ${SOURCE_INSTALL_FILES}
+                DESTINATION ${install_inc}
+        )
+endif()
+
+
+
diff --git a/src/rest-server/pistacheserver.cpp b/src/rest-server/pistacheserver.cpp
new file mode 100644
index 0000000..7f7fed9
--- /dev/null
+++ b/src/rest-server/pistacheserver.cpp
@@ -0,0 +1,200 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#include"pistacheserver.h"
+namespace xapp
+{
+ 
+	pistacheserver::pistacheserver(Pistache::Address addr,std::vector<std::string> method,std::vector<bool> static_routing,std::vector<bool> dynamic_routing)
+        : httpEndpoint(std::make_shared<Pistache::Http::Endpoint>(addr))
+    { 
+	this->t=new std::thread*[1];
+        this->method=method;
+	this->static_routing=static_routing;
+	this->dynamic_routing=dynamic_routing;
+	assert(static_routing.size()==method.size() && dynamic_routing.size()==method.size());
+	stat_sz=cal_stat_size();
+	dyn_sz=cal_dyn_size();
+    }
+   int pistacheserver::cal_stat_size()//caclualting no of true in static_routing
+	{
+		int size=0;
+		for(int i=0;i<static_routing.size();i++)
+		{
+			if (static_routing[i])
+				size++;
+		}
+		return size;
+	}
+
+	 int pistacheserver::cal_dyn_size() //calaculating no true in dynamic_routing
+        {
+                int size=0;
+                for(int i=0;i<dynamic_routing.size();i++)
+                {
+                        if (dynamic_routing[i])
+                                size++;
+                }
+                return size;
+        }
+
+    void pistacheserver::setup_base_url(std::string base)
+    {
+        this->base=base;
+    }
+    void pistacheserver::setup_static_route(std::unordered_map<int,std::string> route)//routing path
+    {
+        this->route_static=route;
+    }
+ void pistacheserver::setup_dynamic_route(std::unordered_map<int,std::string> route)//routing path
+    {
+        this->route_dynamic=route;
+    }
+void pistacheserver::add_static_cb(std::unordered_map<int,usr_callback> cb)
+{
+	this->cb_static=cb;
+}
+void pistacheserver::add_dynamic_cb(std::unordered_map<int,usr_callback> cb) 
+{
+        this->cb_dynamic=cb;
+}
+
+    void pistacheserver::init(size_t thr = 2) 
+    {
+       		 auto opts = Pistache::Http::Endpoint::options().threads(thr).flags(Pistache::Tcp::Options::ReuseAddr)/*.flags(Pistache::Tcp::Options::ReusePort)*/; // how many threads for the server
+       		 httpEndpoint->init(opts);
+		assert(route_static.size()==stat_sz && route_dynamic.size()==dyn_sz); //no of true in satatic_routing and dynamic_routig should match with size of route_static and  route_dynamic respectively. 
+
+		assert(cb_static.size()==stat_sz && cb_dynamic.size()==dyn_sz); //no of true in satatic_routing and dynamic_routig should match with size of cb_static and cb_dynamic respectively.
+		for (int i=0;i<method.size();i++)
+	{
+        	if (method[i]=="get")
+        	{
+            		setupRoutes_get(i+1);
+        	}
+        	else if (method[i]=="post" )
+        	{
+            		setupRoutes_post(i+1);
+        	}
+
+        	else if (method[i]=="del")
+        	{
+            		setupRoutes_del(i+1);
+        	}
+	
+       		else
+        	{
+            		std::cout<<"Wrong Method called \n";
+        	}
+    	}
+
+
+    }
+
+
+    void pistacheserver::start()
+    {
+	httpEndpoint->setHandler(router.handler());
+        t[0]=new std::thread(&pistacheserver::thread_start,this);
+	t[0]->detach();
+    }
+    void pistacheserver::thread_start()
+    {
+       this->httpEndpoint->serve();
+
+    }
+
+    void pistacheserver::shutdown()
+    {
+        httpEndpoint->shutdown();
+    }
+
+    void pistacheserver::setupRoutes_get(int index)
+    {
+        using namespace Pistache::Rest;
+	auto search_s=route_static.find(index);
+        auto search_d=route_dynamic.find(index);
+        auto cbs_search=cb_static.find(index);
+        auto cbd_search=cb_dynamic.find(index);
+        assert (search_s!=route_static.end() || search_d!=route_dynamic.end()); 
+        if (static_routing[index-1])
+                {
+		std::cout<<"static routing get"<<std::endl;
+                assert (search_s!=route_static.end() && cbs_search!=cb_static.end());
+                Routes::Get(router, base + search_s->second, Routes::bind(cbs_search->second));
+                }
+        if (dynamic_routing[index-1])
+                {
+		std::cout<<"dynamic routing get"<<std::endl;
+                assert (search_d!=route_dynamic.end() && cbd_search!=cb_dynamic.end());
+                Routes::Get(router, base + search_d->second+ dynamic_id, Routes::bind(cbd_search->second));
+                }
+
+	// Default handler, called when a route is not found
+        router.addCustomHandler(Routes::bind(&pistacheserver::default_handler, this));
+    }
+    void pistacheserver::setupRoutes_post(int index)
+    {
+        using namespace Pistache::Rest;
+	auto search_s=route_static.find(index);
+	auto search_d=route_dynamic.find(index);
+	auto cbs_search=cb_static.find(index);
+	auto cbd_search=cb_dynamic.find(index);
+	assert (search_s!=route_static.end() || search_d!=route_dynamic.end()); 
+	if (static_routing[index-1])
+		{
+		std::cout<<"static routing post"<<std::endl;
+		assert (search_s!=route_static.end() && cbs_search!=cb_static.end());
+        	Routes::Post(router, base + search_s->second, Routes::bind(cbs_search->second));
+		}
+	if (dynamic_routing[index-1])
+		{
+		std::cout<<"dynamic routing post"<<std::endl;
+		assert (search_d!=route_dynamic.end() && cbd_search!=cb_dynamic.end());
+		Routes::Post(router, base + search_d->second+ dynamic_id, Routes::bind(cbd_search->second));
+		}
+        // Default handler, called when a route is not found
+        router.addCustomHandler(Routes::bind(&pistacheserver::default_handler, this));
+    }
+    void pistacheserver::setupRoutes_del(int index)
+    {
+        using namespace Pistache::Rest;
+        auto search_s=route_static.find(index);
+        auto search_d=route_dynamic.find(index);
+        auto cbs_search=cb_static.find(index);
+        auto cbd_search=cb_dynamic.find(index);
+        assert (search_s!=route_static.end() || search_d!=route_dynamic.end()); 
+        if (static_routing[index-1])
+                {
+		std::cout<<"static routing delete"<<std::endl;
+                assert (search_s!=route_static.end() && cbs_search!=cb_static.end());
+                Routes::Delete(router, base + search_s->second, Routes::bind(cbs_search->second));
+                }
+        if (dynamic_routing[index-1])
+                {
+		std::cout<<"dynamic routing delete"<<std::endl;
+                assert (search_d!=route_dynamic.end() && cbd_search!=cb_dynamic.end());
+                Routes::Delete(router, base + search_d->second+ dynamic_id, Routes::bind(cbd_search->second));
+		}
+	// Default handler, called when a route is not found
+        router.addCustomHandler(Routes::bind(&pistacheserver::default_handler, this));
+    }
+
+}
+
+
+
diff --git a/src/rest-server/pistacheserver.h b/src/rest-server/pistacheserver.h
new file mode 100644
index 0000000..75fb9b8
--- /dev/null
+++ b/src/rest-server/pistacheserver.h
@@ -0,0 +1,80 @@
+/*
+# ==================================================================================
+# Copyright (c) 2020 HCL Technologies Limited.
+#
+# 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.
+# ==================================================================================
+*/
+#ifndef _pistacheserver_h
+#define _pistacheserver_h
+#include <pistache/endpoint.h>
+#include <pistache/http.h>
+#include <pistache/router.h>
+#include <pistache/http_headers.h>
+#include<vector>
+#include<string>
+#include<memory>
+#include<thread>
+#include<vector>
+#include<unordered_set>
+#include<assert.h>
+#include<functional>
+#include<unordered_map>
+namespace xapp
+{
+    using usr_callback=void(*)(const Pistache::Rest::Request &request, Pistache::Http::ResponseWriter response);
+    class pistacheserver
+    {
+        private:
+            std::shared_ptr<Pistache::Http::Endpoint> httpEndpoint;
+            Pistache::Rest::Router router;
+            void setupRoutes_get(int index);
+            void setupRoutes_post(int index);
+            void setupRoutes_del(int index);
+
+            std::vector<std::string> method;
+	    std::vector< bool> static_routing;
+            std::vector<bool> dynamic_routing;
+            std::unordered_map<int,std::string> route_static;
+	    std::unordered_map<int,std::string> route_dynamic;
+	    std::unordered_map<int,usr_callback> cb_static;
+	    std::unordered_map<int,usr_callback> cb_dynamic;
+
+	    std::string base = "/ric/v1";
+            std::string dynamic_id="/:Id";
+	    int stat_sz=0;
+	    int dyn_sz=0;
+	    int cal_stat_size();
+	    int cal_dyn_size();
+	    std::thread **t;
+        public:
+	    void thread_start();
+            pistacheserver(Pistache::Address addr,std::vector<std::string> method,std::vector<bool> static_routing,std::vector<bool> dynamic_routing);
+	    virtual ~pistacheserver(){};
+	    virtual void default_handler(const Pistache::Rest::Request &request, Pistache::Http::ResponseWriter response)
+		 {
+        		response.send(Pistache::Http::Code::Not_Found, "The requested method does not exist");
+   		 }
+
+            void init(size_t thr);
+            void setup_base_url(std::string base);
+            void setup_static_route(std::unordered_map<int,std::string> route);//routing path
+	    void setup_dynamic_route(std::unordered_map<int,std::string> route);
+	    void add_static_cb(std::unordered_map<int,usr_callback> cb);
+	    void add_dynamic_cb(std::unordered_map<int,usr_callback> cb);
+            void start();
+            void shutdown();
+    };
+}
+#endif
+
diff --git a/src/rest/CMakeLists.txt b/src/rest/CMakeLists.txt
deleted file mode 100644
index 282e9b9..0000000
--- a/src/rest/CMakeLists.txt
+++ /dev/null
@@ -1,27 +0,0 @@
-# vim: sw=4 ts=4 noet:
-#
-#==================================================================================
-#   Copyright (c) 2020 Nokia
-#   Copyright (c) 2020 AT&T Intellectual Property.
-#
-#   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.
-#==================================================================================
-#
-
-
-# For clarity: this generates object, not a lib as the CM command implies.
-#
-add_subdirectory(./model)
-#add_subdirectory(./clientapi)
-#add_subdirectory(./serverapi)
-
diff --git a/src/rest/model/ActionToBeSetup.h b/src/rest/model/ActionToBeSetup.h
deleted file mode 100644
index 6bb8d55..0000000
--- a/src/rest/model/ActionToBeSetup.h
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef XAPP_MODEL_ActionToBeSetup_H
-#define XAPP_MODEL_ActionToBeSetup_H
-#include "ModelBase.h"
-#include "SubsequentAction.h"
-
-namespace xapp {
-namespace model {
-
-using namespace xapp::model;
-using ActionDefinition = std::vector<int>;
-
-struct ActionToBeSetup: ModelBase {
-    ActionDefinition m_ActionDefinition;
-    int ActionID;
-    std::string ActionType;
-    SubsequentAction m_SubsequentAction;
-
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubsequentAction",
-    "properties": {
-        "ActionDefinition": {
-            "description": "Action Definition",
-            "type": "array",
-            "items": {
-                "type": "integer"
-            }
-        },
-        "ActionID": {
-            "description": "Identification of Action",
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 255
-        },
-        "ActionType": {
-            "description": "Type of Action",
-            "type": "string",
-            "enum": ["policy", "insert", "report"]
-        },
-        "SubsequentAction": {
-            "description": "Subsequent Action",
-            "type": "object"
-        }
-    },
-    "required": [
-                 "ActionDefinition",
-                 "ActionID",
-                 "ActionType",
-                 "SubsequentAction"
-                ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, ActionToBeSetup& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-    j.at("ActionDefinition").get_to(ref.m_ActionDefinition);
-    j.at("ActionID").get_to(ref.ActionID);
-    j.at("ActionType").get_to(ref.ActionType);
-    j.at("SubsequentAction").get_to(ref.m_SubsequentAction);
-
-}
-
-void to_json(json& j, const ActionToBeSetup& ref) {
-
-    j = json {
-        {"ActionDefinition", ref.m_ActionDefinition},
-        {"ActionID", ref.ActionID},
-        {"ActionType", ref.ActionType},
-        {"SubsequentAction", ref.m_SubsequentAction}
-    };
-}
-
-using ActionsToBeSetup = std::vector<ActionToBeSetup>;
-
-} /*namespace model*/
-} /*namespace xapp*/
-
-#endif /* XAPP_MODEL_ActionToBeSetup_H */
-
diff --git a/src/rest/model/CMakeLists.txt b/src/rest/model/CMakeLists.txt
deleted file mode 100644
index 932a93c..0000000
--- a/src/rest/model/CMakeLists.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-# vim: sw=4 ts=4 noet:
-#
-#==================================================================================
-#   Copyright (c) 2020 Nokia
-#   Copyright (c) 2020 AT&T Intellectual Property.
-#
-#   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.
-#==================================================================================
-#
-
-
-# For clarity: this generates object, not a lib as the CM command implies.
-#
-if( DEV_PKG )
-	install(
-		DIRECTORY ./ DESTINATION ${install_inc}
-		FILES_MATCHING PATTERN "*.h"
-	)
-endif()
-
diff --git a/src/rest/model/ConfigMetadata.h b/src/rest/model/ConfigMetadata.h
deleted file mode 100644
index a60bfb5..0000000
--- a/src/rest/model/ConfigMetadata.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef XAPP_MODEL_ConfigMetadata_H
-#define XAPP_MODEL_ConfigMetadata_H
-
-#include "ModelBase.h"
-
-namespace xapp {
-namespace model {
-
-struct ConfigMetadata: ModelBase {
-    std::string ConfigType;
-    std::string XappName;
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "ConfigMetadata",
-    "properties": {
-        "ConfigType": {
-            "description": "Type of Config",
-            "type": "string",
-            "enum": ["json", "xml", "other"]
-        },
-        "XappName": {
-            "description": "Name of xApp",
-            "type": "string"
-        }
-    },
-    "required": [
-                 "ConfigType",
-                 "XappName"
-                 ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, ConfigMetadata& ref) {
-
-    std::cout << __func__ << " ConfigMetadata " << std::endl;
-    ref.validate_json(j);
-    j.at("ConfigType").get_to(ref.ConfigType);
-    j.at("XappName").get_to(ref.XappName);
-}
-
-void to_json(json& j, const ConfigMetadata& ref) {
-    j = json {
-        {"ConfigType",ref.ConfigType},
-        {"XappName", ref.XappName}
-    };
-}
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_ConfigMetadata_H*/
diff --git a/src/rest/model/ModelBase.h b/src/rest/model/ModelBase.h
deleted file mode 100644
index 159b772..0000000
--- a/src/rest/model/ModelBase.h
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef XAPP_MODEL_ModelBase_H
-#define XAPP_MODEL_ModelBase_H
-#include <iostream>
-#include <string.h>
-#include <nlohmann/json.hpp>
-#include <nlohmann/json-schema.hpp>
-#include <type_traits>
-
-using nlohmann::json_schema::json_validator;
-using json = nlohmann::json;
-
-namespace xapp {
-namespace model {
-
-std::invalid_argument invalid_parameter("Invalid Json Input");
-
-template<typename ModelType>
-bool _validate(const ModelType model) {
-    json _json = model;
-    json_validator validator;
-    validator.set_root_schema(model.validator_schema);
-
-    try {
-        validator.validate(_json);
-    } catch (const std::exception& e) {
-        std::cerr << "Struct Validation failed, here is why: " << e.what() << "\n";
-        throw;
-    }
-    return true;
-}
-
-struct ModelBase {
-    json validator_schema = R"(
-    {
-        "$schema": "http://json-schema.org/draft-07/schema#",
-        "title": "ModelBase"
-    })"_json;
-
-    bool validate_() {
-        return _validate(std::move(*this));
-    }
-
-    void validate_json(const json& _json) {
-        json_validator validator;
-        validator.set_root_schema(get_validator_schema());
-        try {
-            validator.validate(_json);
-        } catch (const std::exception& e) {
-            throw;
-        }
-        return;
-    }
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, ModelBase& ref) {
-    return;
-}
-void to_json(json& j, const ModelBase& ref) {
-    return;
-}
-
-} /*model*/
-} /*xapp*/
-#endif /*XAPP_MODEL_ModelBase_H*/
diff --git a/src/rest/model/RestModel.h b/src/rest/model/RestModel.h
deleted file mode 100644
index 266e221..0000000
--- a/src/rest/model/RestModel.h
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef XAPP_MODEL_H
-#define XAPP_MODEL_H
-#include "ModelBase.h"
-#include "SubsequentAction.h"
-#include "ActionToBeSetup.h"
-#include "SubscriptionResponse.h"
-#include "ConfigMetadata.h"
-#include "SubscriptionDetail.h"
-#include "SubscriptionParams_ClientEndpoint.h"
-#include "SubscriptionParams_E2SubscriptionDirectives.h"
-#include "SubscriptionParams.h"
-#include "SubscriptionInstance.h"
-#include "SubscriptionData.h"
-
-#endif /*XAPP_MODEL_H*/
diff --git a/src/rest/model/SubscriptionData.h b/src/rest/model/SubscriptionData.h
deleted file mode 100644
index 008b72a..0000000
--- a/src/rest/model/SubscriptionData.h
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionData_H
-#define XAPP_MODEL_SubscriptionData_H
-#include "ModelBase.h"
-#include "SubscriptionInstance.h"
-namespace xapp {
-namespace model {
-
-struct SubscriptionData: ModelBase {
-    std::vector<std::string> ClientEndpoint;
-    std::string Meid;
-    int SubscriptionID;
-    SubscriptionInstances m_SubscriptionInstances;
-
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubscriptionData",
-    "properties": {
-        "SubscriptionId": {
-            "type": "integer"
-        },
-        "Meid": {
-            "type": "string"
-        },
-        "ClientEndpoint": {
-            "type": "array",
-            "items": {
-                "type": "string"
-            }
-        },
-        "SubscriptionInstances": {
-            "type": "array"
-        }
-    },
-    "required": [
-                 "SubscriptionId",
-                 "Meid",
-                 "ClientEndpoint",
-                 "SubscriptionInstances"
-                 ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, SubscriptionData& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-
-    j.at("SubscriptionId").get_to(ref.SubscriptionID);
-    j.at("SubscriptionInstances").get_to(ref.m_SubscriptionInstances);
-    j.at("Meid").get_to(ref.Meid);
-    j.at("ClientEndpoint").get_to(ref.ClientEndpoint);
-}
-
-void to_json(json& j, const SubscriptionData& ref) {
-
-    j = json {
-        {"SubscriptionId",ref.SubscriptionID},
-        {"Meid",ref.Meid},
-        {"ClientEndpoint", ref.ClientEndpoint},
-        {"SubscriptionInstances", ref.m_SubscriptionInstances}
-    };
-}
-
-using SubscriptionList = std::vector<SubscriptionData>;
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_SubscriptionData_H*/
diff --git a/src/rest/model/SubscriptionDetail.h b/src/rest/model/SubscriptionDetail.h
deleted file mode 100644
index 1651619..0000000
--- a/src/rest/model/SubscriptionDetail.h
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionDetail_H
-#define XAPP_MODEL_SubscriptionDetail_H
-#include "ModelBase.h"
-#include "ActionToBeSetup.h"
-
-namespace xapp {
-namespace model {
-
-using EventTriggerDefinition = std::vector<int>;
-
-struct SubscriptionDetail: ModelBase {
-    ActionsToBeSetup ActionToBeSetupList;
-    EventTriggerDefinition EventTriggers;
-    int XappEventInstanceID;
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "Subscription detail",
-    "properties": {
-        "XappEventInstanceId": {
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 255
-        },
-        "EventTriggers": {
-            "description": "Identification of Action",
-            "type": "array",
-            "items": {
-                "type": "integer"
-            }
-        },
-        "ActionToBeSetupList": {
-            "type": "array"
-        }
-    },
-    "required": [
-                 "XappEventInstanceId",
-                 "EventTriggers",
-                 "ActionToBeSetupList"
-                ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-
-};
-
-void from_json(const json& j, SubscriptionDetail& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-
-    j.at("XappEventInstanceId").get_to(ref.XappEventInstanceID);
-    j.at("EventTriggers").get_to(ref.EventTriggers);
-    j.at("ActionToBeSetupList").get_to(ref.ActionToBeSetupList);
-}
-
-void to_json(json& j, const SubscriptionDetail& ref) {
-
-    j = json {
-        {"XappEventInstanceId", ref.XappEventInstanceID},
-        {"EventTriggers", ref.EventTriggers},
-        {"ActionToBeSetupList", ref.ActionToBeSetupList},
-    };
-}
-
-using SubscriptionDetailsList = std::vector<SubscriptionDetail>;
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_SubscriptionDetail_H*/
diff --git a/src/rest/model/SubscriptionInstance.h b/src/rest/model/SubscriptionInstance.h
deleted file mode 100644
index f427e79..0000000
--- a/src/rest/model/SubscriptionInstance.h
+++ /dev/null
@@ -1,83 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionInstance_H
-#define XAPP_MODEL_SubscriptionInstance_H
-#include "ModelBase.h"
-
-namespace xapp {
-namespace model {
-
-struct SubscriptionInstance: ModelBase {
-    int E2EventInstanceID;
-    std::string ErrorCause;
-    std::string ErrorSource;
-    std::string TimeoutType;
-    int XappEventInstanceID;
-
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubscriptionInstance",
-    "description": "xApp service address and port",
-    "properties": {
-        "XappEventInstanceId": {
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 65535
-        },
-        "E2EventInstanceId": {
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 65535
-        },
-        "ErrorCause": {
-            "description": "Descriptive error cause. Empty string when no error.",
-            "type": "string"
-        },
-        "ErrorSource": {
-            "description": "Source of error cause.",
-            "type": "string",
-            "enum": ["SUBMGR", "RTMGR", "DBAAS", "ASN1", "E2Node"]
-        },
-        "TimeoutType": {
-            "description": "Type timeout. xApp should retry if timeout occurs.",
-            "type": "string",
-            "enum": ["E2-Timeout", "RTMGR-Timeout", "DBAAS-Timeout"]
-        }
-    },
-    "required": [
-                 "XappEventInstanceId",
-                 "E2EventInstanceId"
-                 ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, SubscriptionInstance& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-
-    j.at("XappEventInstanceId").get_to(ref.XappEventInstanceID);
-    j.at("E2EventInstanceId").get_to(ref.E2EventInstanceID);
-    j.at("ErrorCause").get_to(ref.ErrorCause);
-    j.at("ErrorSource").get_to(ref.ErrorSource);
-    j.at("TimeoutType").get_to(ref.TimeoutType);
-}
-
-void to_json(json& j, const SubscriptionInstance& ref) {
-
-    j = json {
-        {"XappEventInstanceId", ref.XappEventInstanceID},
-        {"E2EventInstanceId", ref.E2EventInstanceID},
-        {"ErrorCause", ref.ErrorCause},
-        {"ErrorSource", ref.ErrorSource},
-        {"TimeoutType", ref.TimeoutType}
-    };
-}
-
-using SubscriptionInstances = std::vector<SubscriptionInstance>;
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_SubscriptionInstance_H*/
diff --git a/src/rest/model/SubscriptionParams.h b/src/rest/model/SubscriptionParams.h
deleted file mode 100644
index cc19750..0000000
--- a/src/rest/model/SubscriptionParams.h
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionParams_H
-#define XAPP_MODEL_SubscriptionParams_H
-#include "ModelBase.h"
-#include "SubscriptionDetail.h"
-#include "SubscriptionParams_ClientEndpoint.h"
-#include "SubscriptionParams_E2SubscriptionDirectives.h"
-
-namespace xapp {
-namespace model {
-
-struct SubscriptionParams: public ModelBase {
-
-    SubscriptionParams_ClientEndpoint ClientEndpoint;
-    SubscriptionParams_E2SubscriptionDirectives E2SubscriptionDirectives;
-    std::string Meid;
-    int RANFunctionID;
-    std::string SubscriptionID;
-    SubscriptionDetailsList m_SubscriptionDetailsList;
-
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubscriptionParams",
-    "properties": {
-        "SubscriptionId": {
-            "description": "Optional subscription ID '(Submgr allocates if not given)'",
-            "type": "string"
-        },
-        "Meid": {
-            "type": "string"
-        },
-        "RANFunctionId": {
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 4095
-        }
-    },
-    "required": [
-                 "ClientEndpoint",
-                 "Meid",
-                 "RANFunctionId",
-                 "SubscriptionDetails"
-                ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-
-};
-
-void from_json(const json& j, SubscriptionParams& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-    j.at("ClientEndpoint").get_to(ref.ClientEndpoint);
-
-    if (j.contains("E2SubscriptionDirectives"))
-    {
-        j.at("E2SubscriptionDirectives").get_to(ref.E2SubscriptionDirectives);
-    }
-
-    if (j.contains("SubscriptionId"))
-    {
-        j.at("SubscriptionId").get_to(ref.SubscriptionID);
-    }
-
-    j.at("Meid").get_to(ref.Meid);
-    j.at("RANFunctionId").get_to(ref.RANFunctionID);
-    j.at("SubscriptionDetails").get_to(ref.m_SubscriptionDetailsList);
-}
-
-void to_json(json& j, const SubscriptionParams& ref) {
-
-    j = json {
-        {"ClientEndpoint", ref.ClientEndpoint},
-        {"E2SubscriptionDirectives", ref.E2SubscriptionDirectives},
-        {"Meid", ref.Meid},
-        {"RANFunctionId", ref.RANFunctionID},
-        {"SubscriptionId", ref.SubscriptionID},
-        {"SubscriptionDetails", ref.m_SubscriptionDetailsList},
-    };
-}
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_SubscriptionParams_H*/
diff --git a/src/rest/model/SubscriptionParams_ClientEndpoint.h b/src/rest/model/SubscriptionParams_ClientEndpoint.h
deleted file mode 100644
index 3d43997..0000000
--- a/src/rest/model/SubscriptionParams_ClientEndpoint.h
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionParams_ClientEndpoint_H
-#define XAPP_MODEL_SubscriptionParams_ClientEndpoint_H
-#include "ModelBase.h"
-
-namespace xapp {
-namespace model {
-
-struct SubscriptionParams_ClientEndpoint: ModelBase {
-    int HTTPPort;
-    std::string Host;
-    int RMRPort;
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubscriptionParams_ClientEndpoint",
-    "description": "xApp service address and port",
-    "properties": {
-        "HTTPPort": {
-            "description": "xApp HTTP service address port",
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 65535
-        },
-        "Host": {
-            "description": "xApp service address name like service-ricxapp-xappname-http.ricxapp",
-            "type": "string"
-        },
-        "RMRPort": {
-            "description": "xApp RMR service address port",
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 65535
-        }
-    },
-    "required": [
-                 "HTTPPort",
-                 "Host",
-                 "RMRPort"
-                 ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, SubscriptionParams_ClientEndpoint& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-    j.at("HTTPPort").get_to(ref.HTTPPort);
-    j.at("Host").get_to(ref.Host);
-    j.at("RMRPort").get_to(ref.RMRPort);
-}
-
-void to_json(json& j, const SubscriptionParams_ClientEndpoint& ref) {
-    j = json {
-        {"HTTPPort", ref.HTTPPort},
-        {"Host", ref.Host},
-        {"RMRPort", ref.RMRPort},
-    };
-}
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_SubscriptionParams_ClientEndpoint_H*/
diff --git a/src/rest/model/SubscriptionParams_E2SubscriptionDirectives.h b/src/rest/model/SubscriptionParams_E2SubscriptionDirectives.h
deleted file mode 100644
index a0f783c..0000000
--- a/src/rest/model/SubscriptionParams_E2SubscriptionDirectives.h
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionParams_E2SubscriptionDirectives_H
-#define XAPP_MODEL_SubscriptionParams_E2SubscriptionDirectives_H
-#include "ModelBase.h"
-
-namespace xapp {
-namespace model {
-
-struct SubscriptionParams_E2SubscriptionDirectives: ModelBase {
-    int E2RetryCount;
-    int E2TimeoutTimerValue;
-    bool RMRRoutingNeeded;
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubscriptionParams_E2SubscriptionDirectives",
-    "description": "Optional. If not set Submgr uses its default values",
-    "properties": {
-        "E2RetryCount": {
-            "description": "How many times E2 subscription request is retried",
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 10
-        },
-        "E2TimeoutTimerValue": {
-            "description": "How long time response is waited from E2 node",
-            "type": "integer",
-            "minimum": 0,
-            "maximum": 10
-        },
-        "RMRRoutingNeeded": {
-            "description": "Subscription needs RMR route from E2Term to xApp",
-            "type": "boolean"
-        }
-    },
-    "required": [
-                 "E2TimeoutTimerValue",
-                 "E2RetryCount",
-                 "RMRRoutingNeeded"
-                ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, SubscriptionParams_E2SubscriptionDirectives& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-
-    j.at("E2RetryCount").get_to(ref.E2RetryCount);
-    j.at("E2TimeoutTimerValue").get_to(ref.E2TimeoutTimerValue);
-    j.at("RMRRoutingNeeded").get_to(ref.RMRRoutingNeeded);
-}
-
-void to_json(json& j, const SubscriptionParams_E2SubscriptionDirectives& ref) {
-
-    j = json {
-        {"E2RetryCount", ref.E2RetryCount},
-        {"E2TimeoutTimerValue", ref.E2TimeoutTimerValue},
-        {"RMRRoutingNeeded", ref.RMRRoutingNeeded},
-    };
-}
-
-} /*namespace model*/
-} /*namespace xapp*/
-#endif /*XAPP_MODEL_SubscriptionParams_ClientEndpoint_H*/
diff --git a/src/rest/model/SubscriptionResponse.h b/src/rest/model/SubscriptionResponse.h
deleted file mode 100644
index 3d8e8d4..0000000
--- a/src/rest/model/SubscriptionResponse.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef XAPP_MODEL_SubscriptionResponse_H
-#define XAPP_MODEL_SubscriptionResponse_H
-#include "ModelBase.h"
-#include "SubscriptionInstance.h"
-
-namespace xapp {
-namespace model {
-
-struct SubscriptionResponse: ModelBase {
-    int SubscriptionID;
-    SubscriptionInstances m_SubscriptionInstances;
-
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubscriptionResponse",
-    "properties": {
-        "SubscriptionId": {
-            "description": "Indentification of Subscription",
-            "type": "integer"
-        },
-        "SubscriptionInstances": {
-            "description": "List of Subscription Instance",
-            "type": "array"
-        }
-    },
-    "required": [
-                 "SubscriptionId",
-                 "SubscriptionInstances"
-                 ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, SubscriptionResponse& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << std::endl;
-    ref.validate_json(j);
-
-    j.at("SubscriptionId").get_to(ref.SubscriptionID);
-    j.at("SubscriptionInstances").get_to(ref.m_SubscriptionInstances);
-}
-
-void to_json(json& j, const SubscriptionResponse& ref) {
-
-    j = json {
-        {"SubscriptionId",ref.SubscriptionID},
-        {"SubscriptionInstances", ref.m_SubscriptionInstances}
-    };
-}
-
-} /*model*/
-} /*xapp*/
-#endif /*XAPP_MODEL_SubscriptionResponse_H*/
diff --git a/src/rest/model/SubsequentAction.h b/src/rest/model/SubsequentAction.h
deleted file mode 100644
index 0943579..0000000
--- a/src/rest/model/SubsequentAction.h
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef XAPP_MODEL_SubsequentAction_H
-#define XAPP_MODEL_SubsequentAction_H
-#include "ModelBase.h"
-
-namespace xapp {
-namespace model {
-
-struct SubsequentAction: ModelBase {
-    std::string SubsequentActionType;
-    std::string TimeToWait;
-    json validator_schema = R"(
-    {
-    "$schema": "http://json-schema.org/draft-07/schema#",
-    "title": "SubsequentAction",
-    "properties": {
-        "SubsequentActionType": {
-            "description": "Type of Subsequent Action",
-            "type": "string",
-            "enum": ["wait", "continue"]
-
-        },
-        "TimeToWait": {
-            "description": "Time to waiting",
-            "type": "string",
-            "enum": ["zero", "w1ms", "w2ms", "w5ms", "w10ms", "w20ms", "w30ms",
-                    "w40ms", "w50ms", "w100ms", "w200ms", "w500ms", "w1s",
-                    "w2s", "w5s", "w10s", "w20s", "w60s"]
-        }
-    },
-    "required": [
-                 "SubsequentActionType",
-                 "TimeToWait"
-                 ],
-    "type": "object"
-    })"_json;
-
-    virtual json get_validator_schema() const { return validator_schema; }
-};
-
-void from_json(const json& j, SubsequentAction& ref) {
-
-    std::cout << __PRETTY_FUNCTION__ << "\n";
-    ref.validate_json(j);
-
-    j.at("SubsequentActionType").get_to(ref.SubsequentActionType);
-    j.at("TimeToWait").get_to(ref.TimeToWait);
-}
-
-void to_json(json& j, const SubsequentAction& ref) {
-
-    j = json {
-        {"SubsequentActionType",ref.SubsequentActionType},
-        {"TimeToWait", ref.TimeToWait}
-    };
-}
-
-} /*model*/
-} /*xapp*/
-#endif /*XAPP_MODEL_SubsequentAction_H*/
diff --git a/test/Makefile b/test/Makefile
index 7be7eee..ed36205 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -2,7 +2,7 @@
 coverage_opts = -ftest-coverage -fprofile-arcs
 
 binaries = unit_test jhash_test config_test metrics_test
-include = -I ../src/xapp -I ../src/alarm -I ../src/messaging  -I  ../src/config -I ../ext/jsmn  -I  ../src/json -I ../src/metrics
+include = -I ../src/xapp -I ../src/alarm -I ../src/messaging  -I  ../src/config -I ../ext/jsmn  -I  ../src/json -I ../src/metrics  -I ../src/model -I ../src/rest-client -I ../src/rest-server
 
 tests::	$(binaries)
 
@@ -14,7 +14,7 @@
 # emulate (and don't need to)
 #
 unit_test:: unit_test.cpp rmr_em.o
-	g++ -g $(coverage_opts) $(include) unit_test.cpp -o unit_test -L../.build -lricxfcpp rmr_em.o  -lrmr_si -lpthread
+	g++ -g $(coverage_opts) $(include) unit_test.cpp -o unit_test -L../.build -lricxfcpp rmr_em.o  -lrmr_si -lpthread -lm -lboost_system -lcrypto -lssl -lcpprest -lpistache -lnlohmann_json_schema_validator
 
 # build a special jwrapper object with coverage settings
 jwrapper_test.o:: ../src/json/jwrapper.c ../src/json/jwrapper.h
@@ -22,13 +22,13 @@
 
 jhash_test:: jwrapper_test.o jhash_test.cpp
 	# do NOT link the xapp lib; we include all modules in the test programme
-	g++ -g $(coverage_opts) -I ../src/json -I ../ext/jsmn jhash_test.cpp -o jhash_test jwrapper_test.o -lrmr_si -lpthread
+	g++ -g $(coverage_opts) -I ../src/json -I ../ext/jsmn jhash_test.cpp -o jhash_test jwrapper_test.o -lrmr_si -lpthread -lm -lboost_system -lcrypto -lssl -lcpprest -lpistache -lnlohmann_json_schema_validator
 
 metrics_test:: metrics_test.cpp rmr_em.o
-	g++ -g $(coverage_opts) $(include) metrics_test.cpp -o metrics_test -L../.build -lricxfcpp rmr_em.o -l rmr_si -lpthread
+	g++ -g $(coverage_opts) $(include) metrics_test.cpp -o metrics_test -L../.build -lricxfcpp rmr_em.o -l rmr_si -lpthread -lm -lboost_system -lcrypto -lssl -lcpprest -lpistache -lnlohmann_json_schema_validator
 
 config_test:: config_test.cpp jwrapper_test.o
-	g++ -g $(coverage_opts) $(include) config_test.cpp -o config_test jwrapper_test.o -lricxfcpp -lrmr_si -lpthread
+	g++ -g $(coverage_opts) $(include) config_test.cpp -o config_test jwrapper_test.o -lricxfcpp -lrmr_si -lpthread -lm -lboost_system -lcrypto -lssl -lcpprest -lpistache -lnlohmann_json_schema_validator
 
 # prune gcov files generated by system include files
 clean::
@@ -38,3 +38,4 @@
 nuke::
 	rm -f *.a *.o *.gcov *.gcda *.gcno core a.out $(binaries)
 
+