diff --git a/ext/odata-jpa/odata-jpa-core/pom.xml b/ext/odata-jpa/odata-jpa-core/pom.xml
index 2567339..5145d1e 100644
--- a/ext/odata-jpa/odata-jpa-core/pom.xml
+++ b/ext/odata-jpa/odata-jpa-core/pom.xml
@@ -36,5 +36,9 @@
 			<artifactId>odata-jpa-api</artifactId>
 			<version>${project.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>org.eclipse.persistence</groupId>
+			<artifactId>javax.persistence</artifactId>
+		</dependency>
 	</dependencies>
 </project>
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java
index a6308fa..d69521c 100644
--- a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAContextImpl.java
@@ -18,20 +18,44 @@
  */
 package org.apache.olingo.jpa.core;
 
+import javax.persistence.EntityManagerFactory;
+
 import org.apache.olingo.jpa.api.ODataJPAContext;
+import org.apache.olingo.jpa.api.extension.JPACsdlMetaModelExtension;
 
 public class ODataJPAContextImpl implements ODataJPAContext {
 
+  private String pUnitName;
+  private EntityManagerFactory emf;
+  private JPACsdlMetaModelExtension extension = null;
+
   @Override
   public String getPersistenceUnitName() {
-    // TODO Auto-generated method stub
-    return null;
+    return pUnitName;
   }
 
   @Override
-  public void setPersistenceUnitName() {
-    // TODO Auto-generated method stub
-    
+  public void setPersistenceUnitName(final String pUnitName) {
+    this.pUnitName = pUnitName;
   }
 
+  @Override
+  public EntityManagerFactory getEntityManagerFactory() {
+    return emf;
+  }
+
+  @Override
+  public void setEntityManagerFactory(final EntityManagerFactory emf) {
+    this.emf = emf;
+  }
+
+  @Override
+  public JPACsdlMetaModelExtension getJPACsdlMetaModelExtension() {
+    return extension;
+  }
+
+  @Override
+  public void setJPACsdlMetaModelExtension(JPACsdlMetaModelExtension extension) {
+    this.extension = extension;
+  }
 }
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAProcessorDefault.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAProcessorDefault.java
new file mode 100644
index 0000000..b0754c2
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/ODataJPAProcessorDefault.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core;
+
+import org.apache.olingo.commons.api.format.ContentType;
+import org.apache.olingo.jpa.api.ODataJPAProcessor;
+import org.apache.olingo.server.api.OData;
+import org.apache.olingo.server.api.ODataApplicationException;
+import org.apache.olingo.server.api.ODataRequest;
+import org.apache.olingo.server.api.ODataResponse;
+import org.apache.olingo.server.api.ServiceMetadata;
+import org.apache.olingo.server.api.serializer.SerializerException;
+import org.apache.olingo.server.api.uri.UriInfo;
+
+public class ODataJPAProcessorDefault implements ODataJPAProcessor {
+
+  @Override
+  public void readEntityCollection(ODataRequest arg0, ODataResponse arg1, UriInfo arg2, ContentType arg3)
+      throws ODataApplicationException, SerializerException {
+    // TODO Auto-generated method stub
+    
+  }
+
+  @Override
+  public void init(OData arg0, ServiceMetadata arg1) {
+    // TODO Auto-generated method stub
+    
+  }
+
+}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java
index 44811db..ec2cac7 100644
--- a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/edm/ODataJPAEdmProvider.java
@@ -18,8 +18,34 @@
  */
 package org.apache.olingo.jpa.core.edm;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.olingo.commons.api.ODataException;
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
 import org.apache.olingo.jpa.api.ODataJPAAbstractEdmProvider;
+import org.apache.olingo.jpa.api.ODataJPAContext;
+import org.apache.olingo.jpa.api.model.JPACsdlBuilder;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelAccessor;
+import org.apache.olingo.jpa.api.model.JPACsdlSchemaAccessor;
+import org.apache.olingo.jpa.core.model.JPACsdlMetaModel;
 
 public class ODataJPAEdmProvider extends ODataJPAAbstractEdmProvider {
 
+  private List<CsdlSchema> csdlSchemas = new ArrayList<CsdlSchema>();
+
+  public ODataJPAEdmProvider(ODataJPAContext context) {
+    super(context);
+  }
+
+  @Override
+  public List<CsdlSchema> getSchemas() throws ODataException {
+    // Build CSDL Schema if not yet built
+    if (csdlSchemas.isEmpty()) {
+      JPACsdlBuilder jpaCsdlMetaModelBuilder = JPACsdlMetaModel.newJPACsdlMetaModelBuilder(this.getODataJPAContext());
+      JPACsdlMetaModelAccessor metaModelAccessor = jpaCsdlMetaModelBuilder.build();
+      csdlSchemas.add(((JPACsdlSchemaAccessor) metaModelAccessor).getCsdlSchema());
+    }
+    return csdlSchemas;
+  }
 }
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java
index 18299fb..b02512e 100644
--- a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/factory/ODataJPAFactoryImpl.java
@@ -25,6 +25,7 @@
 import org.apache.olingo.jpa.api.ODataJPAProcessor;
 import org.apache.olingo.jpa.api.factory.ODataJPAFactory;
 import org.apache.olingo.jpa.core.ODataJPAContextImpl;
+import org.apache.olingo.jpa.core.ODataJPAProcessorDefault;
 import org.apache.olingo.jpa.core.edm.ODataJPAEdmProvider;
 import org.apache.olingo.jpa.core.exception.ODataJPARuntimeException;
 
@@ -34,15 +35,17 @@
       new HashMap<String, ODataJPAAbstractEdmProvider>();
 
   @Override
-  public ODataJPAAbstractEdmProvider getODataJPAEdmProvider(String pUnitName) throws ODataJPARuntimeException {
+  public ODataJPAAbstractEdmProvider getODataJPAEdmProvider(ODataJPAContext odataJPAContext)
+      throws ODataJPARuntimeException {
     ODataJPAAbstractEdmProvider odataJPAEdmProvider = null;
-    if (pUnitName == null) {
+    String pUnitName = odataJPAContext.getPersistenceUnitName();
+    if (odataJPAContext == null || pUnitName == null) {
       throw new ODataJPARuntimeException("Unable to create Edm Provider", null,
           ODataJPARuntimeException.MessageKeys.NULL_PUNIT, null);
     } else {
       odataJPAEdmProvider = edmProviderMap.get(pUnitName);
       if (odataJPAEdmProvider == null) {
-        odataJPAEdmProvider = new ODataJPAEdmProvider();
+        odataJPAEdmProvider = new ODataJPAEdmProvider(odataJPAContext);
         edmProviderMap.put(pUnitName, odataJPAEdmProvider);
       }
     }
@@ -52,8 +55,7 @@
 
   @Override
   public ODataJPAProcessor getODataJPAProcessor(ODataJPAContext odataJPAContext) {
-    // TODO Auto-generated method stub
-    return null;
+    return new ODataJPAProcessorDefault();
   }
 
   @Override
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlMetaModel.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlMetaModel.java
new file mode 100644
index 0000000..67f5b4e
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlMetaModel.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core.model;
+
+import javax.persistence.metamodel.Metamodel;
+
+import org.apache.olingo.jpa.api.ODataJPAContext;
+import org.apache.olingo.jpa.api.exception.ODataJPAException;
+import org.apache.olingo.jpa.api.extension.JPACsdlMetaModelExtension;
+import org.apache.olingo.jpa.api.model.JPACsdlBuilder;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelAccessor;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelContext;
+import org.apache.olingo.jpa.api.model.JPACsdlSchemaAccessor;
+
+/**
+ * A meta model that holds JPA Model element definition and its corresponding CSDL definition
+ */
+public class JPACsdlMetaModel implements JPACsdlMetaModelContext {
+  private String pUnitName = null;
+  private Metamodel jpaMetaModel = null;
+  private JPACsdlMetaModelExtension extension = null;
+
+  private JPACsdlMetaModel() {}
+
+  public static JPACsdlBuilder newJPACsdlMetaModelBuilder(ODataJPAContext odataJPAContext) {
+    return new JPACsdlMetaModel.JPACsdlMetaModelBuilder(odataJPAContext);
+  }
+
+  @Override
+  public String getPersistenceUnit() {
+    return pUnitName;
+  }
+
+  @Override
+  public Metamodel getJPAMetaModel() {
+    return jpaMetaModel;
+  }
+
+  @Override
+  public JPACsdlMetaModelExtension getJPACsdlMetaModelExtension() {
+    return extension;
+  }
+
+  protected void setPersistenceUnit(String pUnitName) {
+    this.pUnitName = pUnitName;
+  }
+
+  protected void setJPAMetaModel(Metamodel metaModel) {
+    this.jpaMetaModel = metaModel;
+  }
+
+  public void setJPACsdlMetaModelExtension(JPACsdlMetaModelExtension jpaCsdlMetaModelExtension) {
+    extension = jpaCsdlMetaModelExtension;
+  }
+
+  private static class JPACsdlMetaModelBuilder implements JPACsdlBuilder {
+
+    private ODataJPAContext odataJPAContext = null;
+
+    public JPACsdlMetaModelBuilder(ODataJPAContext odataJPAContext) {
+      this.odataJPAContext = odataJPAContext;
+    }
+
+    @Override
+    public JPACsdlMetaModelAccessor build() throws ODataJPAException {
+      JPACsdlMetaModel jpaCsdlMetaModel = new JPACsdlMetaModel();
+      jpaCsdlMetaModel.setJPAMetaModel(odataJPAContext.getEntityManagerFactory().getMetamodel());
+      jpaCsdlMetaModel.setPersistenceUnit(odataJPAContext.getPersistenceUnitName());
+      jpaCsdlMetaModel.setJPACsdlMetaModelExtension(odataJPAContext.getJPACsdlMetaModelExtension());
+
+      JPACsdlSchemaAccessor jpaCsdlSchemaAccessor = new JPACsdlSchema(jpaCsdlMetaModel);
+      return jpaCsdlSchemaAccessor.getJPACsdlBuilder().build();
+    }
+  }
+
+}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlNameBuilder.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlNameBuilder.java
new file mode 100644
index 0000000..c9eaf50
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlNameBuilder.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core.model;
+
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelContext;
+
+/**
+ * The class builds the Name for Csdl Elements derived from JPA Meta Model elements
+ */
+public class JPACsdlNameBuilder {
+  public static String buildSchemaNamespace(JPACsdlMetaModelContext context) {
+    return context.getPersistenceUnit();
+  }
+}
diff --git a/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlSchema.java b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlSchema.java
new file mode 100644
index 0000000..8d9c901
--- /dev/null
+++ b/ext/odata-jpa/odata-jpa-core/src/main/java/org/apache/olingo/jpa/core/model/JPACsdlSchema.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.olingo.jpa.core.model;
+
+import org.apache.olingo.commons.api.edm.provider.CsdlSchema;
+import org.apache.olingo.jpa.api.exception.ODataJPAException;
+import org.apache.olingo.jpa.api.model.JPACsdlBuilder;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelAccessor;
+import org.apache.olingo.jpa.api.model.JPACsdlMetaModelContext;
+import org.apache.olingo.jpa.api.model.JPACsdlSchemaAccessor;
+
+public class JPACsdlSchema implements JPACsdlSchemaAccessor {
+  private CsdlSchema csdlSchema;
+  private JPACsdlBuilder builder = null;
+  private JPACsdlMetaModelContext context = null;
+
+  public JPACsdlSchema(JPACsdlMetaModelContext context) {
+    this.context = context;
+  }
+
+  @Override
+  public CsdlSchema getCsdlSchema() {
+    return this.csdlSchema;
+  }
+
+  @Override
+  public JPACsdlBuilder getJPACsdlBuilder() {
+    if (builder == null) {
+      builder = new JPACsdlSchemaBuilder();
+    }
+    return builder;
+  }
+
+  private class JPACsdlSchemaBuilder implements JPACsdlBuilder {
+
+    @Override
+    public JPACsdlMetaModelAccessor build() throws ODataJPAException {
+      csdlSchema = new CsdlSchema();
+      csdlSchema.setNamespace(JPACsdlNameBuilder.buildSchemaNamespace(context));
+      return JPACsdlSchema.this;
+    }
+
+  }
+}
