http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/rest/src/main/java/org/jahia/unomi/geonames/rest/GeonamesEndPoint.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/rest/src/main/java/org/jahia/unomi/geonames/rest/GeonamesEndPoint.java
 
b/extensions/geonames/rest/src/main/java/org/jahia/unomi/geonames/rest/GeonamesEndPoint.java
deleted file mode 100644
index bde8cfc..0000000
--- 
a/extensions/geonames/rest/src/main/java/org/jahia/unomi/geonames/rest/GeonamesEndPoint.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * 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.jahia.unomi.geonames.rest;
-
-import org.apache.cxf.common.util.StringUtils;
-import org.apache.cxf.rs.security.cors.CrossOriginResourceSharing;
-import org.jahia.unomi.geonames.services.GeonameEntry;
-import org.jahia.unomi.geonames.services.GeonamesService;
-import org.oasis_open.contextserver.api.PartialList;
-
-import javax.jws.WebMethod;
-import javax.jws.WebService;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.PathSegment;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-@WebService
-@Produces(MediaType.APPLICATION_JSON + ";charset=UTF-8")
-@CrossOriginResourceSharing(
-        allowAllOrigins = true,
-        allowCredentials = true
-)
-public class GeonamesEndPoint {
-
-    private GeonamesService geonamesService;
-
-    public GeonamesEndPoint() {
-        System.out.println("Initializing geonames service endpoint...");
-    }
-
-    @WebMethod(exclude = true)
-    public void setGeonamesService(GeonamesService geonamesService) {
-        this.geonamesService = geonamesService;
-    }
-
-    @GET
-    @Path("/reverseGeoCode/{latlon}")
-    public List<GeonameEntry> reverseGeoCode(@PathParam("latlon") String 
latlon, @HeaderParam("Accept-Language") String language) {
-        String[] s = latlon.split(",");
-        List<GeonameEntry> entries = geonamesService.reverseGeoCode(s[0], 
s[1]);
-        translate(entries, new Locale(language));
-        return entries;
-    }
-
-    @GET
-    @Path("/entries/{items:.*}")
-    public PartialList<GeonameEntry> getChildrenEntries(@PathParam("items") 
List<PathSegment> items, @HeaderParam("Accept-Language") String language) {
-        List<String> l = new ArrayList<>();
-        for (PathSegment item : items) {
-            l.add(item.getPath());
-        }
-        PartialList<GeonameEntry> list = geonamesService.getChildrenEntries(l, 
0, 999);
-        translate(list.getList(), new Locale(language));
-        return list;
-    }
-
-    @GET
-    @Path("/cities/{items:.*}")
-    public PartialList<GeonameEntry> getChildrenCities(@PathParam("items") 
List<PathSegment> items, @HeaderParam("Accept-Language") String language) {
-        List<String> l = new ArrayList<>();
-        for (PathSegment item : items) {
-            l.add(item.getPath());
-        }
-        PartialList<GeonameEntry> list = geonamesService.getChildrenCities(l, 
0, 999);
-        translate(list.getList(), new Locale(language));
-        return list;
-    }
-
-    @GET
-    @Path("/hierarchy/{id}")
-    public List<GeonameEntry> getHierarchy(@PathParam("id") String id, 
@HeaderParam("Accept-Language") String language) {
-        List<GeonameEntry> list = geonamesService.getHierarchy(id);
-        translate(list, new Locale(language));
-        return list;
-    }
-
-    @GET
-    @Path("/capitals/{id}")
-    public List<GeonameEntry> getCapitalEntries(@PathParam("id") String id, 
@HeaderParam("Accept-Language") String language) {
-        List<GeonameEntry> list = geonamesService.getCapitalEntries(id);
-        translate(list, new Locale(language));
-        return list;
-    }
-
-    private void translate(List<GeonameEntry> l, Locale locale) {
-        for (GeonameEntry entry : l) {
-            if 
(GeonamesService.COUNTRY_FEATURE_CODES.contains(entry.getFeatureCode())) {
-                String name = new Locale("", 
entry.getCountryCode()).getDisplayCountry(locale);
-                if (!StringUtils.isEmpty(name) && 
!name.equals(entry.getCountryCode())) {
-                    entry.setName(name);
-                }
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml 
b/extensions/geonames/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 55b41c1..590fef7 100644
--- 
a/extensions/geonames/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ 
b/extensions/geonames/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -30,7 +30,7 @@
     </cxf:bus>
 
     <bean id="cors-filter" 
class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter"/>
-    <bean id="jacksonMapper" 
class="org.oasis_open.contextserver.persistence.spi.CustomObjectMapper"/>
+    <bean id="jacksonMapper" 
class="org.apache.unomi.persistence.spi.CustomObjectMapper"/>
     <bean id="jaxb-provider" 
class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
         <argument index="0" ref="jacksonMapper" 
type="com.fasterxml.jackson.databind.ObjectMapper "/>
         <argument index="1" 
type="com.fasterxml.jackson.jaxrs.cfg.Annotations[]">
@@ -65,9 +65,9 @@
         </jaxrs:serviceBeans>
     </jaxrs:server>
 
-    <reference id="geonamesService" 
interface="org.jahia.unomi.geonames.services.GeonamesService"/>
+    <reference id="geonamesService" 
interface="org.apache.unomi.geonames.services.GeonamesService"/>
 
-    <bean id="geonamesServiceEndPoint" 
class="org.jahia.unomi.geonames.rest.GeonamesEndPoint">
+    <bean id="geonamesServiceEndPoint" 
class="org.apache.unomi.geonames.rest.GeonamesEndPoint">
         <property name="geonamesService" ref="geonamesService"/>
     </bean>
 </blueprint>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonameEntry.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonameEntry.java
 
b/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonameEntry.java
new file mode 100644
index 0000000..014a699
--- /dev/null
+++ 
b/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonameEntry.java
@@ -0,0 +1,213 @@
+/*
+ * 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.unomi.geonames.services;
+
+import org.apache.unomi.api.Item;
+
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class GeonameEntry extends Item {
+    public static final String ITEM_TYPE = "geonameEntry";
+    public static final String INDEX_NAME = "geonames";
+    private static final long serialVersionUID = 1L;
+    protected String name;
+    protected String asciiname;
+    protected List<String> alternatenames;
+
+    protected Map<String, Double> location;
+
+    protected String featureClass;
+    protected String featureCode;
+    protected String countryCode;
+    protected List<String> cc2;
+    protected String admin1Code;
+    protected String admin2Code;
+    protected String admin3Code;
+    protected String admin4Code;
+    protected Integer population;
+    protected Integer elevation;
+    protected String dem;
+    protected String timezone;
+    protected Date modificationDate;
+
+    public GeonameEntry() {
+    }
+
+    public GeonameEntry(String geonameId, String name, String asciiname, 
Double lat, Double lon, String featureClass, String featureCode, String 
countryCode, List<String> cc2, String admin1Code, String admin2Code, String 
admin3Code, String admin4Code, Integer population, Integer elevation, String 
dem, String timezone, Date modificationDate) {
+        super(geonameId);
+        this.name = name;
+        this.asciiname = asciiname;
+//        this.alternatenames = alternatenames;
+        this.location = new HashMap<>();
+        this.location.put("lat",lat);
+        this.location.put("lon",lon);
+        this.featureClass = featureClass;
+        this.featureCode = featureCode;
+        this.countryCode = countryCode;
+        this.cc2 = cc2;
+        this.admin1Code = admin1Code;
+        this.admin2Code = admin2Code;
+        this.admin3Code = admin3Code;
+        this.admin4Code = admin4Code;
+        this.population = population;
+        this.elevation = elevation;
+        this.dem = dem;
+        this.timezone = timezone;
+        this.modificationDate = modificationDate;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getAsciiname() {
+        return asciiname;
+    }
+
+    public void setAsciiname(String asciiname) {
+        this.asciiname = asciiname;
+    }
+
+//    public List<String> getAlternatenames() {
+//        return alternatenames;
+//    }
+//
+//    public void setAlternatenames(List<String> alternatenames) {
+//        this.alternatenames = alternatenames;
+//    }
+
+    public Map<String, Double> getLocation() {
+        return location;
+    }
+
+    public void setLocation(Map<String, Double> location) {
+        this.location = location;
+    }
+
+    public String getFeatureClass() {
+        return featureClass;
+    }
+
+    public void setFeatureClass(String featureClass) {
+        this.featureClass = featureClass;
+    }
+
+    public String getFeatureCode() {
+        return featureCode;
+    }
+
+    public void setFeatureCode(String featureCode) {
+        this.featureCode = featureCode;
+    }
+
+    public String getCountryCode() {
+        return countryCode;
+    }
+
+    public void setCountryCode(String countryCode) {
+        this.countryCode = countryCode;
+    }
+
+    public List<String> getCc2() {
+        return cc2;
+    }
+
+    public void setCc2(List<String> cc2) {
+        this.cc2 = cc2;
+    }
+
+    public String getAdmin1Code() {
+        return admin1Code;
+    }
+
+    public void setAdmin1Code(String admin1Code) {
+        this.admin1Code = admin1Code;
+    }
+
+    public String getAdmin2Code() {
+        return admin2Code;
+    }
+
+    public void setAdmin2Code(String admin2Code) {
+        this.admin2Code = admin2Code;
+    }
+
+    public String getAdmin3Code() {
+        return admin3Code;
+    }
+
+    public void setAdmin3Code(String admin3Code) {
+        this.admin3Code = admin3Code;
+    }
+
+    public String getAdmin4Code() {
+        return admin4Code;
+    }
+
+    public void setAdmin4Code(String admin4Code) {
+        this.admin4Code = admin4Code;
+    }
+
+    public Integer getPopulation() {
+        return population;
+    }
+
+    public void setPopulation(Integer population) {
+        this.population = population;
+    }
+
+    public Integer getElevation() {
+        return elevation;
+    }
+
+    public void setElevation(Integer elevation) {
+        this.elevation = elevation;
+    }
+
+    public String getDem() {
+        return dem;
+    }
+
+    public void setDem(String dem) {
+        this.dem = dem;
+    }
+
+    public String getTimezone() {
+        return timezone;
+    }
+
+    public void setTimezone(String timezone) {
+        this.timezone = timezone;
+    }
+
+    public Date getModificationDate() {
+        return modificationDate;
+    }
+
+    public void setModificationDate(Date modificationDate) {
+        this.modificationDate = modificationDate;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesService.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesService.java
 
b/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesService.java
new file mode 100644
index 0000000..c3158fe
--- /dev/null
+++ 
b/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesService.java
@@ -0,0 +1,44 @@
+/*
+ * 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.unomi.geonames.services;
+
+import org.apache.unomi.api.PartialList;
+
+import java.util.Arrays;
+import java.util.List;
+
+public interface GeonamesService {
+    List<String> FEATURES_CLASSES = Arrays.asList("A", "P");
+    List<String> COUNTRY_FEATURE_CODES = Arrays.asList("PCL", "PCLD", "PCLF", 
"PCL", "PCLI", "PCLIX", "PCLS");
+    List<String> ADM1_FEATURE_CODES = Arrays.asList("ADM1");
+    List<String> ADM2_FEATURE_CODES = Arrays.asList("ADM2");
+    List<String> CITIES_FEATURE_CODES = Arrays.asList("PPL", "PPLA", "PPLA2", 
"PPLA3", "PPLA4", "PPLC", "PPLCH", "PPLF", "PPLG", "PPLL", "PPLR", "PPLR");
+    List<List<String>> ORDERED_FEATURES = Arrays.asList(COUNTRY_FEATURE_CODES, 
ADM1_FEATURE_CODES, ADM2_FEATURE_CODES, CITIES_FEATURE_CODES);
+
+    void importDatabase();
+
+    List<GeonameEntry> reverseGeoCode(String lat, String lon);
+
+    List<GeonameEntry> getHierarchy(String id);
+
+    PartialList<GeonameEntry> getChildrenEntries(List<String> items, int 
offset, int size);
+
+    PartialList<GeonameEntry> getChildrenCities(List<String> items, int 
offset, int size);
+
+    List<GeonameEntry> getCapitalEntries(String itemId);
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesServiceImpl.java
 
b/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesServiceImpl.java
new file mode 100644
index 0000000..e89a630
--- /dev/null
+++ 
b/extensions/geonames/services/src/main/java/org/apache/unomi/geonames/services/GeonamesServiceImpl.java
@@ -0,0 +1,302 @@
+/*
+ * 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.unomi.geonames.services;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.unomi.api.PartialList;
+import org.apache.unomi.api.conditions.Condition;
+import org.apache.unomi.api.services.DefinitionsService;
+import org.apache.unomi.persistence.spi.PersistenceService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+public class GeonamesServiceImpl implements GeonamesService {
+    public static final String GEOCODING_MAX_DISTANCE = "100km";
+    private static final Logger logger = 
LoggerFactory.getLogger(GeonamesServiceImpl.class.getName());
+    private DefinitionsService definitionsService;
+    private PersistenceService persistenceService;
+
+    private String pathToGeonamesDatabase;
+    private Boolean forceDbImport;
+
+    public void setForceDbImport(Boolean forceDbImport) {
+        this.forceDbImport = forceDbImport;
+    }
+
+    public void setDefinitionsService(DefinitionsService definitionsService) {
+        this.definitionsService = definitionsService;
+    }
+
+    public void setPersistenceService(PersistenceService persistenceService) {
+        this.persistenceService = persistenceService;
+    }
+
+    public void setPathToGeonamesDatabase(String pathToGeonamesDatabase) {
+        this.pathToGeonamesDatabase = pathToGeonamesDatabase;
+    }
+
+    public void start() {
+        importDatabase();
+    }
+
+    public void stop() {
+    }
+
+    public void importDatabase() {
+        if (!persistenceService.createIndex("geonames")) {
+            if (forceDbImport) {
+                persistenceService.removeIndex("geonames");
+                persistenceService.createIndex("geonames");
+                logger.info("Geonames index removed and recreated");
+            } else if 
(persistenceService.getAllItemsCount(GeonameEntry.ITEM_TYPE) > 0) {
+                return;
+            }
+        } else {
+            logger.info("Geonames index created");
+        }
+
+        if (pathToGeonamesDatabase == null) {
+            logger.info("No geonames DB provided");
+            return;
+        }
+        final File f = new File(pathToGeonamesDatabase);
+        if (f.exists()) {
+            Timer t = new Timer();
+            t.schedule(new TimerTask() {
+                @Override
+                public void run() {
+                    try {
+                        ZipInputStream zipInputStream = new ZipInputStream(new 
FileInputStream(f));
+                        ZipEntry zipEntry = zipInputStream.getNextEntry();
+
+                        BufferedReader reader = new BufferedReader(new 
InputStreamReader(zipInputStream, "UTF-8"));
+
+                        SimpleDateFormat sdf = new 
SimpleDateFormat("yyyy-MM-dd");
+                        String line;
+                        logger.info("Starting to import geonames database 
...");
+                        while ((line = reader.readLine()) != null) {
+                            String[] values = line.split("\t");
+
+                            if (FEATURES_CLASSES.contains(values[6])) {
+                                GeonameEntry geonameEntry = new 
GeonameEntry(values[0], values[1], values[2],
+                                        StringUtils.isEmpty(values[4]) ? null 
: Double.parseDouble(values[4]),
+                                        StringUtils.isEmpty(values[5]) ? null 
: Double.parseDouble(values[5]),
+                                        values[6], values[7], values[8],
+                                        Arrays.asList(values[9].split(",")),
+                                        values[10], values[11], values[12], 
values[13],
+                                        StringUtils.isEmpty(values[14]) ? null 
: Integer.parseInt(values[14]),
+                                        StringUtils.isEmpty(values[15]) ? null 
: Integer.parseInt(values[15]),
+                                        values[16], values[17],
+                                        sdf.parse(values[18]));
+
+                                persistenceService.save(geonameEntry);
+                            }
+                        }
+                        logger.info("Geonames database imported");
+                    } catch (Exception e) {
+                        logger.error(e.getMessage(), e);
+                    }
+                }
+            }, 5000);
+        }
+    }
+
+    public List<GeonameEntry> getHierarchy(String itemId) {
+        return getHierarchy(persistenceService.load(itemId, 
GeonameEntry.class));
+    }
+
+    public List<GeonameEntry> getHierarchy(GeonameEntry entry) {
+        List<GeonameEntry> entries = new ArrayList<>();
+        entries.add(entry);
+
+        List<Condition> l = new ArrayList<>();
+        Condition andCondition = new Condition();
+        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
+        andCondition.setParameter("operator", "and");
+        andCondition.setParameter("subConditions", l);
+
+        Condition featureCodeCondition = new Condition();
+        
featureCodeCondition.setConditionType(definitionsService.getConditionType("sessionPropertyCondition"));
+        featureCodeCondition.setParameter("propertyName", "featureCode");
+        featureCodeCondition.setParameter("comparisonOperator", "in");
+        l.add(featureCodeCondition);
+
+        PartialList<GeonameEntry> country = buildHierarchy(andCondition, 
featureCodeCondition, "countryCode", entry.getCountryCode(), 
COUNTRY_FEATURE_CODES, 0, 1);
+
+        if (!StringUtils.isEmpty(entry.getAdmin1Code())) {
+            PartialList<GeonameEntry> adm1 = buildHierarchy(andCondition, 
featureCodeCondition, "admin1Code", entry.getAdmin1Code(), ADM1_FEATURE_CODES, 
0, 1);
+
+            if (!StringUtils.isEmpty(entry.getAdmin2Code())) {
+                PartialList<GeonameEntry> adm2 = buildHierarchy(andCondition, 
featureCodeCondition, "admin2Code", entry.getAdmin2Code(), ADM2_FEATURE_CODES, 
0, 1);
+
+                if (!adm2.getList().isEmpty()) {
+                    entries.add(adm2.get(0));
+                }
+            }
+            if (!adm1.getList().isEmpty()) {
+                entries.add(adm1.get(0));
+            }
+
+        }
+
+        if (!country.getList().isEmpty()) {
+            entries.add(country.get(0));
+        }
+        return entries;
+    }
+
+    private PartialList<GeonameEntry> buildHierarchy(Condition andCondition, 
Condition featureCodeCondition, String featurePropertyName, String 
featureValue, List<String> featuresCode, int offset, int size) {
+        featureCodeCondition.setParameter("propertyValues", featuresCode);
+
+        List<Condition> l = (List<Condition>) 
andCondition.getParameter("subConditions");
+        Condition condition = getPropertyCondition(featurePropertyName, 
"propertyValue", featureValue, "equals");
+        l.add(condition);
+
+        return persistenceService.query(andCondition, null, 
GeonameEntry.class, offset, size);
+    }
+
+    public List<GeonameEntry> reverseGeoCode(String lat, String lon) {
+        List<Condition> l = new ArrayList<Condition>();
+        Condition andCondition = new Condition();
+        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
+        andCondition.setParameter("operator", "and");
+        andCondition.setParameter("subConditions", l);
+
+
+        Condition geoLocation = new Condition();
+        
geoLocation.setConditionType(definitionsService.getConditionType("geoLocationByPointSessionCondition"));
+        geoLocation.setParameter("type", "circle");
+        geoLocation.setParameter("circleLatitude", Double.parseDouble(lat));
+        geoLocation.setParameter("circleLongitude", Double.parseDouble(lon));
+        geoLocation.setParameter("distance", GEOCODING_MAX_DISTANCE);
+        l.add(geoLocation);
+
+        l.add(getPropertyCondition("featureCode", "propertyValues", 
CITIES_FEATURE_CODES, "in"));
+
+        PartialList<GeonameEntry> list = 
persistenceService.query(andCondition, "geo:location:" + lat + ":" + lon, 
GeonameEntry.class, 0, 1);
+        if (!list.getList().isEmpty()) {
+            return getHierarchy(list.getList().get(0));
+        }
+        return Collections.emptyList();
+    }
+
+
+    public PartialList<GeonameEntry> getChildrenEntries(List<String> items, 
int offset, int size) {
+        Condition andCondition = getItemsInChildrenQuery(items, 
CITIES_FEATURE_CODES);
+        Condition featureCodeCondition = ((List<Condition>) 
andCondition.getParameter("subConditions")).get(0);
+        int level = items.size();
+
+        featureCodeCondition.setParameter("propertyValues", 
ORDERED_FEATURES.get(level));
+        PartialList<GeonameEntry> r = persistenceService.query(andCondition, 
null, GeonameEntry.class, offset, size);
+        while (r.size() == 0 && level < ORDERED_FEATURES.size() - 1) {
+            level++;
+            featureCodeCondition.setParameter("propertyValues", 
ORDERED_FEATURES.get(level));
+            r = persistenceService.query(andCondition, null, 
GeonameEntry.class, offset, size);
+        }
+        return r;
+    }
+
+    public PartialList<GeonameEntry> getChildrenCities(List<String> items, int 
offset, int size) {
+        return persistenceService.query(getItemsInChildrenQuery(items, 
CITIES_FEATURE_CODES), null, GeonameEntry.class, offset, size);
+    }
+
+    private Condition getItemsInChildrenQuery(List<String> items, List<String> 
featureCodes) {
+        List<Condition> l = new ArrayList<Condition>();
+        Condition andCondition = new Condition();
+        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
+        andCondition.setParameter("operator", "and");
+        andCondition.setParameter("subConditions", l);
+
+        Condition featureCodeCondition = getPropertyCondition("featureCode", 
"propertyValues", featureCodes, "in");
+        l.add(featureCodeCondition);
+
+        if (items.size() > 0) {
+            l.add(getPropertyCondition("countryCode", "propertyValue", 
items.get(0), "equals"));
+        }
+        if (items.size() > 1) {
+            l.add(getPropertyCondition("admin1Code", "propertyValue", 
items.get(1), "equals"));
+        }
+        if (items.size() > 2) {
+            l.add(getPropertyCondition("admin2Code", "propertyValue", 
items.get(2), "equals"));
+        }
+        return andCondition;
+    }
+
+    public List<GeonameEntry> getCapitalEntries(String itemId) {
+        GeonameEntry entry = persistenceService.load(itemId, 
GeonameEntry.class);
+        List<String> featureCodes;
+
+        List<Condition> l = new ArrayList<Condition>();
+        Condition andCondition = new Condition();
+        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
+        andCondition.setParameter("operator", "and");
+        andCondition.setParameter("subConditions", l);
+
+        l.add(getPropertyCondition("countryCode", "propertyValue", 
entry.getCountryCode(), "equals"));
+
+        if (COUNTRY_FEATURE_CODES.contains(entry.getFeatureCode())) {
+            featureCodes = Arrays.asList("PPLC");
+        } else if (ADM1_FEATURE_CODES.contains(entry.getFeatureCode())) {
+            featureCodes = Arrays.asList("PPLA", "PPLC");
+            l.add(getPropertyCondition("admin1Code", "propertyValue", 
entry.getAdmin1Code(), "equals"));
+        } else if (ADM2_FEATURE_CODES.contains(entry.getFeatureCode())) {
+            featureCodes = Arrays.asList("PPLA2", "PPLA", "PPLC");
+            l.add(getPropertyCondition("admin1Code", "propertyValue", 
entry.getAdmin1Code(), "equals"));
+            l.add(getPropertyCondition("admin2Code", "propertyValue", 
entry.getAdmin2Code(), "equals"));
+        } else {
+            return Collections.emptyList();
+        }
+
+        Condition featureCodeCondition = new Condition();
+        
featureCodeCondition.setConditionType(definitionsService.getConditionType("sessionPropertyCondition"));
+        featureCodeCondition.setParameter("propertyName", "featureCode");
+        featureCodeCondition.setParameter("propertyValues", featureCodes);
+        featureCodeCondition.setParameter("comparisonOperator", "in");
+        l.add(featureCodeCondition);
+        List<GeonameEntry> entries = persistenceService.query(andCondition, 
null, GeonameEntry.class);
+        if (entries.size() == 0) {
+            featureCodeCondition.setParameter("propertyValues", 
CITIES_FEATURE_CODES);
+            entries = persistenceService.query(andCondition, 
"population:desc", GeonameEntry.class, 0, 1).getList();
+        }
+        if (entries.size() > 0) {
+            return getHierarchy(entries.get(0));
+        }
+        return Collections.emptyList();
+    }
+
+    private Condition getPropertyCondition(String name, String 
propertyValueField, Object value, String operator) {
+        Condition condition = new Condition();
+        
condition.setConditionType(definitionsService.getConditionType("sessionPropertyCondition"));
+        condition.setParameter("propertyName", name);
+        condition.setParameter(propertyValueField, value);
+        condition.setParameter("comparisonOperator", operator);
+        return condition;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonameEntry.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonameEntry.java
 
b/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonameEntry.java
deleted file mode 100644
index cd2fa3b..0000000
--- 
a/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonameEntry.java
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * 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.jahia.unomi.geonames.services;
-
-import org.oasis_open.contextserver.api.Item;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class GeonameEntry extends Item {
-    public static final String ITEM_TYPE = "geonameEntry";
-    public static final String INDEX_NAME = "geonames";
-    private static final long serialVersionUID = 1L;
-    protected String name;
-    protected String asciiname;
-    protected List<String> alternatenames;
-
-    protected Map<String, Double> location;
-
-    protected String featureClass;
-    protected String featureCode;
-    protected String countryCode;
-    protected List<String> cc2;
-    protected String admin1Code;
-    protected String admin2Code;
-    protected String admin3Code;
-    protected String admin4Code;
-    protected Integer population;
-    protected Integer elevation;
-    protected String dem;
-    protected String timezone;
-    protected Date modificationDate;
-
-    public GeonameEntry() {
-    }
-
-    public GeonameEntry(String geonameId, String name, String asciiname, 
Double lat, Double lon, String featureClass, String featureCode, String 
countryCode, List<String> cc2, String admin1Code, String admin2Code, String 
admin3Code, String admin4Code, Integer population, Integer elevation, String 
dem, String timezone, Date modificationDate) {
-        super(geonameId);
-        this.name = name;
-        this.asciiname = asciiname;
-//        this.alternatenames = alternatenames;
-        this.location = new HashMap<>();
-        this.location.put("lat",lat);
-        this.location.put("lon",lon);
-        this.featureClass = featureClass;
-        this.featureCode = featureCode;
-        this.countryCode = countryCode;
-        this.cc2 = cc2;
-        this.admin1Code = admin1Code;
-        this.admin2Code = admin2Code;
-        this.admin3Code = admin3Code;
-        this.admin4Code = admin4Code;
-        this.population = population;
-        this.elevation = elevation;
-        this.dem = dem;
-        this.timezone = timezone;
-        this.modificationDate = modificationDate;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getAsciiname() {
-        return asciiname;
-    }
-
-    public void setAsciiname(String asciiname) {
-        this.asciiname = asciiname;
-    }
-
-//    public List<String> getAlternatenames() {
-//        return alternatenames;
-//    }
-//
-//    public void setAlternatenames(List<String> alternatenames) {
-//        this.alternatenames = alternatenames;
-//    }
-
-    public Map<String, Double> getLocation() {
-        return location;
-    }
-
-    public void setLocation(Map<String, Double> location) {
-        this.location = location;
-    }
-
-    public String getFeatureClass() {
-        return featureClass;
-    }
-
-    public void setFeatureClass(String featureClass) {
-        this.featureClass = featureClass;
-    }
-
-    public String getFeatureCode() {
-        return featureCode;
-    }
-
-    public void setFeatureCode(String featureCode) {
-        this.featureCode = featureCode;
-    }
-
-    public String getCountryCode() {
-        return countryCode;
-    }
-
-    public void setCountryCode(String countryCode) {
-        this.countryCode = countryCode;
-    }
-
-    public List<String> getCc2() {
-        return cc2;
-    }
-
-    public void setCc2(List<String> cc2) {
-        this.cc2 = cc2;
-    }
-
-    public String getAdmin1Code() {
-        return admin1Code;
-    }
-
-    public void setAdmin1Code(String admin1Code) {
-        this.admin1Code = admin1Code;
-    }
-
-    public String getAdmin2Code() {
-        return admin2Code;
-    }
-
-    public void setAdmin2Code(String admin2Code) {
-        this.admin2Code = admin2Code;
-    }
-
-    public String getAdmin3Code() {
-        return admin3Code;
-    }
-
-    public void setAdmin3Code(String admin3Code) {
-        this.admin3Code = admin3Code;
-    }
-
-    public String getAdmin4Code() {
-        return admin4Code;
-    }
-
-    public void setAdmin4Code(String admin4Code) {
-        this.admin4Code = admin4Code;
-    }
-
-    public Integer getPopulation() {
-        return population;
-    }
-
-    public void setPopulation(Integer population) {
-        this.population = population;
-    }
-
-    public Integer getElevation() {
-        return elevation;
-    }
-
-    public void setElevation(Integer elevation) {
-        this.elevation = elevation;
-    }
-
-    public String getDem() {
-        return dem;
-    }
-
-    public void setDem(String dem) {
-        this.dem = dem;
-    }
-
-    public String getTimezone() {
-        return timezone;
-    }
-
-    public void setTimezone(String timezone) {
-        this.timezone = timezone;
-    }
-
-    public Date getModificationDate() {
-        return modificationDate;
-    }
-
-    public void setModificationDate(Date modificationDate) {
-        this.modificationDate = modificationDate;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesService.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesService.java
 
b/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesService.java
deleted file mode 100644
index 950df51..0000000
--- 
a/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesService.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.jahia.unomi.geonames.services;
-
-import org.oasis_open.contextserver.api.PartialList;
-
-import java.util.Arrays;
-import java.util.List;
-
-public interface GeonamesService {
-    List<String> FEATURES_CLASSES = Arrays.asList("A", "P");
-    List<String> COUNTRY_FEATURE_CODES = Arrays.asList("PCL", "PCLD", "PCLF", 
"PCL", "PCLI", "PCLIX", "PCLS");
-    List<String> ADM1_FEATURE_CODES = Arrays.asList("ADM1");
-    List<String> ADM2_FEATURE_CODES = Arrays.asList("ADM2");
-    List<String> CITIES_FEATURE_CODES = Arrays.asList("PPL", "PPLA", "PPLA2", 
"PPLA3", "PPLA4", "PPLC", "PPLCH", "PPLF", "PPLG", "PPLL", "PPLR", "PPLR");
-    List<List<String>> ORDERED_FEATURES = Arrays.asList(COUNTRY_FEATURE_CODES, 
ADM1_FEATURE_CODES, ADM2_FEATURE_CODES, CITIES_FEATURE_CODES);
-
-    void importDatabase();
-
-    List<GeonameEntry> reverseGeoCode(String lat, String lon);
-
-    List<GeonameEntry> getHierarchy(String id);
-
-    PartialList<GeonameEntry> getChildrenEntries(List<String> items, int 
offset, int size);
-
-    PartialList<GeonameEntry> getChildrenCities(List<String> items, int 
offset, int size);
-
-    List<GeonameEntry> getCapitalEntries(String itemId);
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesServiceImpl.java
 
b/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesServiceImpl.java
deleted file mode 100644
index 74a142e..0000000
--- 
a/extensions/geonames/services/src/main/java/org/jahia/unomi/geonames/services/GeonamesServiceImpl.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * 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.jahia.unomi.geonames.services;
-
-
-import org.apache.commons.lang3.StringUtils;
-import org.oasis_open.contextserver.api.PartialList;
-import org.oasis_open.contextserver.api.conditions.Condition;
-import org.oasis_open.contextserver.api.services.DefinitionsService;
-import org.oasis_open.contextserver.persistence.spi.PersistenceService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStreamReader;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipInputStream;
-
-public class GeonamesServiceImpl implements GeonamesService {
-    public static final String GEOCODING_MAX_DISTANCE = "100km";
-    private static final Logger logger = 
LoggerFactory.getLogger(GeonamesServiceImpl.class.getName());
-    private DefinitionsService definitionsService;
-    private PersistenceService persistenceService;
-
-    private String pathToGeonamesDatabase;
-    private Boolean forceDbImport;
-
-    public void setForceDbImport(Boolean forceDbImport) {
-        this.forceDbImport = forceDbImport;
-    }
-
-    public void setDefinitionsService(DefinitionsService definitionsService) {
-        this.definitionsService = definitionsService;
-    }
-
-    public void setPersistenceService(PersistenceService persistenceService) {
-        this.persistenceService = persistenceService;
-    }
-
-    public void setPathToGeonamesDatabase(String pathToGeonamesDatabase) {
-        this.pathToGeonamesDatabase = pathToGeonamesDatabase;
-    }
-
-    public void start() {
-        importDatabase();
-    }
-
-    public void stop() {
-    }
-
-    public void importDatabase() {
-        if (!persistenceService.createIndex("geonames")) {
-            if (forceDbImport) {
-                persistenceService.removeIndex("geonames");
-                persistenceService.createIndex("geonames");
-                logger.info("Geonames index removed and recreated");
-            } else if 
(persistenceService.getAllItemsCount(GeonameEntry.ITEM_TYPE) > 0) {
-                return;
-            }
-        } else {
-            logger.info("Geonames index created");
-        }
-
-        if (pathToGeonamesDatabase == null) {
-            logger.info("No geonames DB provided");
-            return;
-        }
-        final File f = new File(pathToGeonamesDatabase);
-        if (f.exists()) {
-            Timer t = new Timer();
-            t.schedule(new TimerTask() {
-                @Override
-                public void run() {
-                    try {
-                        ZipInputStream zipInputStream = new ZipInputStream(new 
FileInputStream(f));
-                        ZipEntry zipEntry = zipInputStream.getNextEntry();
-
-                        BufferedReader reader = new BufferedReader(new 
InputStreamReader(zipInputStream, "UTF-8"));
-
-                        SimpleDateFormat sdf = new 
SimpleDateFormat("yyyy-MM-dd");
-                        String line;
-                        logger.info("Starting to import geonames database 
...");
-                        while ((line = reader.readLine()) != null) {
-                            String[] values = line.split("\t");
-
-                            if (FEATURES_CLASSES.contains(values[6])) {
-                                GeonameEntry geonameEntry = new 
GeonameEntry(values[0], values[1], values[2],
-                                        StringUtils.isEmpty(values[4]) ? null 
: Double.parseDouble(values[4]),
-                                        StringUtils.isEmpty(values[5]) ? null 
: Double.parseDouble(values[5]),
-                                        values[6], values[7], values[8],
-                                        Arrays.asList(values[9].split(",")),
-                                        values[10], values[11], values[12], 
values[13],
-                                        StringUtils.isEmpty(values[14]) ? null 
: Integer.parseInt(values[14]),
-                                        StringUtils.isEmpty(values[15]) ? null 
: Integer.parseInt(values[15]),
-                                        values[16], values[17],
-                                        sdf.parse(values[18]));
-
-                                persistenceService.save(geonameEntry);
-                            }
-                        }
-                        logger.info("Geonames database imported");
-                    } catch (Exception e) {
-                        logger.error(e.getMessage(), e);
-                    }
-                }
-            }, 5000);
-        }
-    }
-
-    public List<GeonameEntry> getHierarchy(String itemId) {
-        return getHierarchy(persistenceService.load(itemId, 
GeonameEntry.class));
-    }
-
-    public List<GeonameEntry> getHierarchy(GeonameEntry entry) {
-        List<GeonameEntry> entries = new ArrayList<>();
-        entries.add(entry);
-
-        List<Condition> l = new ArrayList<>();
-        Condition andCondition = new Condition();
-        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
-        andCondition.setParameter("operator", "and");
-        andCondition.setParameter("subConditions", l);
-
-        Condition featureCodeCondition = new Condition();
-        
featureCodeCondition.setConditionType(definitionsService.getConditionType("sessionPropertyCondition"));
-        featureCodeCondition.setParameter("propertyName", "featureCode");
-        featureCodeCondition.setParameter("comparisonOperator", "in");
-        l.add(featureCodeCondition);
-
-        PartialList<GeonameEntry> country = buildHierarchy(andCondition, 
featureCodeCondition, "countryCode", entry.getCountryCode(), 
COUNTRY_FEATURE_CODES, 0, 1);
-
-        if (!StringUtils.isEmpty(entry.getAdmin1Code())) {
-            PartialList<GeonameEntry> adm1 = buildHierarchy(andCondition, 
featureCodeCondition, "admin1Code", entry.getAdmin1Code(), ADM1_FEATURE_CODES, 
0, 1);
-
-            if (!StringUtils.isEmpty(entry.getAdmin2Code())) {
-                PartialList<GeonameEntry> adm2 = buildHierarchy(andCondition, 
featureCodeCondition, "admin2Code", entry.getAdmin2Code(), ADM2_FEATURE_CODES, 
0, 1);
-
-                if (!adm2.getList().isEmpty()) {
-                    entries.add(adm2.get(0));
-                }
-            }
-            if (!adm1.getList().isEmpty()) {
-                entries.add(adm1.get(0));
-            }
-
-        }
-
-        if (!country.getList().isEmpty()) {
-            entries.add(country.get(0));
-        }
-        return entries;
-    }
-
-    private PartialList<GeonameEntry> buildHierarchy(Condition andCondition, 
Condition featureCodeCondition, String featurePropertyName, String 
featureValue, List<String> featuresCode, int offset, int size) {
-        featureCodeCondition.setParameter("propertyValues", featuresCode);
-
-        List<Condition> l = (List<Condition>) 
andCondition.getParameter("subConditions");
-        Condition condition = getPropertyCondition(featurePropertyName, 
"propertyValue", featureValue, "equals");
-        l.add(condition);
-
-        return persistenceService.query(andCondition, null, 
GeonameEntry.class, offset, size);
-    }
-
-    public List<GeonameEntry> reverseGeoCode(String lat, String lon) {
-        List<Condition> l = new ArrayList<Condition>();
-        Condition andCondition = new Condition();
-        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
-        andCondition.setParameter("operator", "and");
-        andCondition.setParameter("subConditions", l);
-
-
-        Condition geoLocation = new Condition();
-        
geoLocation.setConditionType(definitionsService.getConditionType("geoLocationByPointSessionCondition"));
-        geoLocation.setParameter("type", "circle");
-        geoLocation.setParameter("circleLatitude", Double.parseDouble(lat));
-        geoLocation.setParameter("circleLongitude", Double.parseDouble(lon));
-        geoLocation.setParameter("distance", GEOCODING_MAX_DISTANCE);
-        l.add(geoLocation);
-
-        l.add(getPropertyCondition("featureCode", "propertyValues", 
CITIES_FEATURE_CODES, "in"));
-
-        PartialList<GeonameEntry> list = 
persistenceService.query(andCondition, "geo:location:" + lat + ":" + lon, 
GeonameEntry.class, 0, 1);
-        if (!list.getList().isEmpty()) {
-            return getHierarchy(list.getList().get(0));
-        }
-        return Collections.emptyList();
-    }
-
-
-    public PartialList<GeonameEntry> getChildrenEntries(List<String> items, 
int offset, int size) {
-        Condition andCondition = getItemsInChildrenQuery(items, 
GeonamesService.CITIES_FEATURE_CODES);
-        Condition featureCodeCondition = ((List<Condition>) 
andCondition.getParameter("subConditions")).get(0);
-        int level = items.size();
-
-        featureCodeCondition.setParameter("propertyValues", 
ORDERED_FEATURES.get(level));
-        PartialList<GeonameEntry> r = persistenceService.query(andCondition, 
null, GeonameEntry.class, offset, size);
-        while (r.size() == 0 && level < ORDERED_FEATURES.size() - 1) {
-            level++;
-            featureCodeCondition.setParameter("propertyValues", 
ORDERED_FEATURES.get(level));
-            r = persistenceService.query(andCondition, null, 
GeonameEntry.class, offset, size);
-        }
-        return r;
-    }
-
-    public PartialList<GeonameEntry> getChildrenCities(List<String> items, int 
offset, int size) {
-        return persistenceService.query(getItemsInChildrenQuery(items, 
GeonamesService.CITIES_FEATURE_CODES), null, GeonameEntry.class, offset, size);
-    }
-
-    private Condition getItemsInChildrenQuery(List<String> items, List<String> 
featureCodes) {
-        List<Condition> l = new ArrayList<Condition>();
-        Condition andCondition = new Condition();
-        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
-        andCondition.setParameter("operator", "and");
-        andCondition.setParameter("subConditions", l);
-
-        Condition featureCodeCondition = getPropertyCondition("featureCode", 
"propertyValues", featureCodes, "in");
-        l.add(featureCodeCondition);
-
-        if (items.size() > 0) {
-            l.add(getPropertyCondition("countryCode", "propertyValue", 
items.get(0), "equals"));
-        }
-        if (items.size() > 1) {
-            l.add(getPropertyCondition("admin1Code", "propertyValue", 
items.get(1), "equals"));
-        }
-        if (items.size() > 2) {
-            l.add(getPropertyCondition("admin2Code", "propertyValue", 
items.get(2), "equals"));
-        }
-        return andCondition;
-    }
-
-    public List<GeonameEntry> getCapitalEntries(String itemId) {
-        GeonameEntry entry = persistenceService.load(itemId, 
GeonameEntry.class);
-        List<String> featureCodes;
-
-        List<Condition> l = new ArrayList<Condition>();
-        Condition andCondition = new Condition();
-        
andCondition.setConditionType(definitionsService.getConditionType("booleanCondition"));
-        andCondition.setParameter("operator", "and");
-        andCondition.setParameter("subConditions", l);
-
-        l.add(getPropertyCondition("countryCode", "propertyValue", 
entry.getCountryCode(), "equals"));
-
-        if (COUNTRY_FEATURE_CODES.contains(entry.getFeatureCode())) {
-            featureCodes = Arrays.asList("PPLC");
-        } else if (ADM1_FEATURE_CODES.contains(entry.getFeatureCode())) {
-            featureCodes = Arrays.asList("PPLA", "PPLC");
-            l.add(getPropertyCondition("admin1Code", "propertyValue", 
entry.getAdmin1Code(), "equals"));
-        } else if (ADM2_FEATURE_CODES.contains(entry.getFeatureCode())) {
-            featureCodes = Arrays.asList("PPLA2", "PPLA", "PPLC");
-            l.add(getPropertyCondition("admin1Code", "propertyValue", 
entry.getAdmin1Code(), "equals"));
-            l.add(getPropertyCondition("admin2Code", "propertyValue", 
entry.getAdmin2Code(), "equals"));
-        } else {
-            return Collections.emptyList();
-        }
-
-        Condition featureCodeCondition = new Condition();
-        
featureCodeCondition.setConditionType(definitionsService.getConditionType("sessionPropertyCondition"));
-        featureCodeCondition.setParameter("propertyName", "featureCode");
-        featureCodeCondition.setParameter("propertyValues", featureCodes);
-        featureCodeCondition.setParameter("comparisonOperator", "in");
-        l.add(featureCodeCondition);
-        List<GeonameEntry> entries = persistenceService.query(andCondition, 
null, GeonameEntry.class);
-        if (entries.size() == 0) {
-            featureCodeCondition.setParameter("propertyValues", 
CITIES_FEATURE_CODES);
-            entries = persistenceService.query(andCondition, 
"population:desc", GeonameEntry.class, 0, 1).getList();
-        }
-        if (entries.size() > 0) {
-            return getHierarchy(entries.get(0));
-        }
-        return Collections.emptyList();
-    }
-
-    private Condition getPropertyCondition(String name, String 
propertyValueField, Object value, String operator) {
-        Condition condition = new Condition();
-        
condition.setConditionType(definitionsService.getConditionType("sessionPropertyCondition"));
-        condition.setParameter("propertyName", name);
-        condition.setParameter(propertyValueField, value);
-        condition.setParameter("comparisonOperator", operator);
-        return condition;
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/geonames/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git 
a/extensions/geonames/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 
b/extensions/geonames/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 0da9bae..95a7366 100644
--- 
a/extensions/geonames/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ 
b/extensions/geonames/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -30,14 +30,15 @@
     </cm:property-placeholder>
 
     <reference id="persistenceService"
-               
interface="org.oasis_open.contextserver.persistence.spi.PersistenceService"/>
+               
interface="org.apache.unomi.persistence.spi.PersistenceService"/>
 
-    <reference id="definitionsService" 
interface="org.oasis_open.contextserver.api.services.DefinitionsService"/>
+    <reference id="definitionsService" 
interface="org.apache.unomi.api.services.DefinitionsService"/>
 
 
     <!-- User List service -->
 
-    <bean id="geonamesServiceImpl" 
class="org.jahia.unomi.geonames.services.GeonamesServiceImpl" 
init-method="start" destroy-method="stop">
+    <bean id="geonamesServiceImpl" 
class="org.apache.unomi.geonames.services.GeonamesServiceImpl" 
init-method="start"
+          destroy-method="stop">
         <property name="persistenceService" ref="persistenceService"/>
         <property name="definitionsService" ref="definitionsService"/>
         <property name="pathToGeonamesDatabase" 
value="${request.geonamesDatabase.location}"/>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/rest/src/main/java/org/apache/unomi/lists/rest/UserListServiceEndPoint.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/rest/src/main/java/org/apache/unomi/lists/rest/UserListServiceEndPoint.java
 
b/extensions/lists-extension/rest/src/main/java/org/apache/unomi/lists/rest/UserListServiceEndPoint.java
new file mode 100644
index 0000000..a4eb8c9
--- /dev/null
+++ 
b/extensions/lists-extension/rest/src/main/java/org/apache/unomi/lists/rest/UserListServiceEndPoint.java
@@ -0,0 +1,83 @@
+/*
+ * 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.unomi.lists.rest;
+
+import org.apache.cxf.rs.security.cors.CrossOriginResourceSharing;
+import org.apache.unomi.api.Metadata;
+import org.apache.unomi.api.PartialList;
+import org.apache.unomi.api.query.Query;
+import org.apache.unomi.lists.UserList;
+import org.apache.unomi.services.UserListService;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+
+
+/**
+ * @author Christophe Laprun
+ */
+@WebService
+@Produces(MediaType.APPLICATION_JSON)
+@CrossOriginResourceSharing(
+        allowAllOrigins = true,
+        allowCredentials = true
+)
+public class UserListServiceEndPoint {
+    private UserListService userListService;
+
+    public UserListServiceEndPoint() {
+        System.out.println("Initializing user list service endpoint...");
+    }
+
+    @WebMethod(exclude = true)
+    public void setUserListService(UserListService userListService) {
+        this.userListService = userListService;
+    }
+
+    @GET
+    @Path("/")
+    public PartialList<Metadata> getListMetadatas() {
+        return userListService.getListMetadatas(0, 50, null);
+    }
+
+    @POST
+    @Path("/query")
+    public PartialList<Metadata> getListMetadatas(Query query) {
+        return userListService.getListMetadatas(query);
+    }
+
+    @GET
+    @Path("/{listId}")
+    public UserList load(@PathParam("listId") String listId) {
+        return userListService.load(listId);
+    }
+
+    @POST
+    @Path("/")
+    public void save(UserList list) {
+        userListService.save(list);
+    }
+
+    @DELETE
+    @Path("/{listId}")
+    public void delete(@PathParam("listId") String listId) {
+        userListService.delete(listId);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/rest/src/main/java/org/jahia/unomi/rest/UserListServiceEndPoint.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/rest/src/main/java/org/jahia/unomi/rest/UserListServiceEndPoint.java
 
b/extensions/lists-extension/rest/src/main/java/org/jahia/unomi/rest/UserListServiceEndPoint.java
deleted file mode 100644
index c0d344d..0000000
--- 
a/extensions/lists-extension/rest/src/main/java/org/jahia/unomi/rest/UserListServiceEndPoint.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.jahia.unomi.rest;
-
-import org.apache.cxf.rs.security.cors.CrossOriginResourceSharing;
-import org.jahia.unomi.lists.UserList;
-import org.jahia.unomi.services.UserListService;
-import org.oasis_open.contextserver.api.Metadata;
-import org.oasis_open.contextserver.api.PartialList;
-import org.oasis_open.contextserver.api.query.Query;
-
-import javax.jws.WebMethod;
-import javax.jws.WebService;
-import javax.ws.rs.*;
-import javax.ws.rs.core.MediaType;
-
-
-/**
- * @author Christophe Laprun
- */
-@WebService
-@Produces(MediaType.APPLICATION_JSON)
-@CrossOriginResourceSharing(
-        allowAllOrigins = true,
-        allowCredentials = true
-)
-public class UserListServiceEndPoint {
-    private UserListService userListService;
-
-    public UserListServiceEndPoint() {
-        System.out.println("Initializing user list service endpoint...");
-    }
-
-    @WebMethod(exclude = true)
-    public void setUserListService(UserListService userListService) {
-        this.userListService = userListService;
-    }
-
-    @GET
-    @Path("/")
-    public PartialList<Metadata> getListMetadatas() {
-        return userListService.getListMetadatas(0, 50, null);
-    }
-
-    @POST
-    @Path("/query")
-    public PartialList<Metadata> getListMetadatas(Query query) {
-        return userListService.getListMetadatas(query);
-    }
-
-    @GET
-    @Path("/{listId}")
-    public UserList load(@PathParam("listId") String listId) {
-        return userListService.load(listId);
-    }
-
-    @POST
-    @Path("/")
-    public void save(UserList list) {
-        userListService.save(list);
-    }
-
-    @DELETE
-    @Path("/{listId}")
-    public void delete(@PathParam("listId") String listId) {
-        userListService.delete(listId);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 
b/extensions/lists-extension/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 327c91d..7b7e626 100644
--- 
a/extensions/lists-extension/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ 
b/extensions/lists-extension/rest/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -30,7 +30,7 @@
     </cxf:bus>
 
     <bean id="cors-filter" 
class="org.apache.cxf.rs.security.cors.CrossOriginResourceSharingFilter"/>
-    <bean id="jacksonMapper" 
class="org.oasis_open.contextserver.persistence.spi.CustomObjectMapper"/>
+    <bean id="jacksonMapper" 
class="org.apache.unomi.persistence.spi.CustomObjectMapper"/>
     <bean id="jaxb-provider" 
class="com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider">
         <argument index="0" ref="jacksonMapper" 
type="com.fasterxml.jackson.databind.ObjectMapper "/>
         <argument index="1" 
type="com.fasterxml.jackson.jaxrs.cfg.Annotations[]">
@@ -65,9 +65,9 @@
         </jaxrs:serviceBeans>
     </jaxrs:server>
 
-    <reference id="userListService" 
interface="org.jahia.unomi.services.UserListService"/>
+    <reference id="userListService" 
interface="org.apache.unomi.services.UserListService"/>
 
-    <bean id="userListServiceEndPoint" 
class="org.jahia.unomi.rest.UserListServiceEndPoint">
+    <bean id="userListServiceEndPoint" 
class="org.apache.unomi.lists.rest.UserListServiceEndPoint">
         <property name="userListService" ref="userListService"/>
     </bean>
 </blueprint>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/java/org/apache/unomi/lists/UserList.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/java/org/apache/unomi/lists/UserList.java
 
b/extensions/lists-extension/services/src/main/java/org/apache/unomi/lists/UserList.java
new file mode 100644
index 0000000..e9ab509
--- /dev/null
+++ 
b/extensions/lists-extension/services/src/main/java/org/apache/unomi/lists/UserList.java
@@ -0,0 +1,38 @@
+/*
+ * 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.unomi.lists;
+
+import org.apache.unomi.api.Metadata;
+import org.apache.unomi.api.MetadataItem;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Christophe Laprun
+ */
+@XmlRootElement
+public class UserList extends MetadataItem {
+    public static final String ITEM_TYPE = "userList";
+    private static final long serialVersionUID = 1L;
+
+    public UserList() {
+    }
+
+    public UserList(Metadata metadata) {
+        super(metadata);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListService.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListService.java
 
b/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListService.java
new file mode 100644
index 0000000..b561337
--- /dev/null
+++ 
b/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListService.java
@@ -0,0 +1,39 @@
+/*
+ * 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.unomi.services;
+
+import org.apache.unomi.api.Metadata;
+import org.apache.unomi.api.PartialList;
+import org.apache.unomi.api.query.Query;
+import org.apache.unomi.lists.UserList;
+
+
+/**
+ * @author Christophe Laprun
+ */
+public interface UserListService {
+
+    PartialList<Metadata> getListMetadatas(int offset, int size, String 
sortBy);
+
+    PartialList<Metadata> getListMetadatas(Query query);
+
+    UserList load(String listId);
+
+    void save(UserList list);
+
+    void delete(String listId);
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListServiceImpl.java
 
b/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListServiceImpl.java
new file mode 100644
index 0000000..e60cb19
--- /dev/null
+++ 
b/extensions/lists-extension/services/src/main/java/org/apache/unomi/services/UserListServiceImpl.java
@@ -0,0 +1,102 @@
+/*
+ * 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.unomi.services;
+
+import org.apache.unomi.api.Metadata;
+import org.apache.unomi.api.PartialList;
+import org.apache.unomi.api.Profile;
+import org.apache.unomi.api.conditions.Condition;
+import org.apache.unomi.api.query.Query;
+import org.apache.unomi.api.services.DefinitionsService;
+import org.apache.unomi.lists.UserList;
+import org.apache.unomi.persistence.spi.PersistenceService;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Christophe Laprun
+ */
+public class UserListServiceImpl implements UserListService {
+    private PersistenceService persistenceService;
+
+    private DefinitionsService definitionsService;
+
+    public void setPersistenceService(PersistenceService persistenceService) {
+        this.persistenceService = persistenceService;
+    }
+
+    public void setDefinitionsService(DefinitionsService definitionsService) {
+        this.definitionsService = definitionsService;
+    }
+
+    public PartialList<Metadata> getListMetadatas(int offset, int size, String 
sortBy) {
+        PartialList<UserList> userLists = 
persistenceService.getAllItems(UserList.class, offset, size, sortBy);
+        List<Metadata> metadata = new LinkedList<>();
+        for (UserList definition : userLists.getList()) {
+            metadata.add(definition.getMetadata());
+        }
+        return new PartialList<>(metadata, userLists.getOffset(), 
userLists.getPageSize(), userLists.getTotalSize());
+    }
+
+    public PartialList<Metadata> getListMetadatas(Query query) {
+        if(query.isForceRefresh()){
+            persistenceService.refresh();
+        }
+        definitionsService.resolveConditionType(query.getCondition());
+        PartialList<UserList> userLists = 
persistenceService.query(query.getCondition(), query.getSortby(), 
UserList.class, query.getOffset(), query.getLimit());
+        List<Metadata> metadata = new LinkedList<>();
+        for (UserList definition : userLists.getList()) {
+            metadata.add(definition.getMetadata());
+        }
+        return new PartialList<>(metadata, userLists.getOffset(), 
userLists.getPageSize(), userLists.getTotalSize());
+    }
+
+    @Override
+    public UserList load(String listId) {
+        return persistenceService.load(listId, UserList.class);
+    }
+
+    @Override
+    public void save(UserList list) {
+        persistenceService.save(list);
+    }
+
+    @Override
+    public void delete(String listId) {
+        Condition query = new 
Condition(definitionsService.getConditionType("profilePropertyCondition"));
+        query.setParameter("propertyName", "systemProperties.lists");
+        query.setParameter("comparisonOperator", "equals");
+        query.setParameter("propertyValue", listId);
+
+        List<Profile> profiles = persistenceService.query(query, null, 
Profile.class);
+        Map<String, Object> profileProps;
+        for (Profile p : profiles) {
+            profileProps = p.getSystemProperties();
+            if(profileProps != null && profileProps.get("lists") != null) {
+                int index = ((List) profileProps.get("lists")).indexOf(listId);
+                if(index != -1){
+                    ((List) profileProps.get("lists")).remove(index);
+                    persistenceService.update(p.getItemId(), null, 
Profile.class, "systemProperties", profileProps);
+                }
+            }
+        }
+
+        persistenceService.remove(listId, UserList.class);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/java/org/jahia/unomi/lists/UserList.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/java/org/jahia/unomi/lists/UserList.java
 
b/extensions/lists-extension/services/src/main/java/org/jahia/unomi/lists/UserList.java
deleted file mode 100644
index 8072657..0000000
--- 
a/extensions/lists-extension/services/src/main/java/org/jahia/unomi/lists/UserList.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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.jahia.unomi.lists;
-
-import org.oasis_open.contextserver.api.Metadata;
-import org.oasis_open.contextserver.api.MetadataItem;
-
-import javax.xml.bind.annotation.XmlRootElement;
-
-/**
- * @author Christophe Laprun
- */
-@XmlRootElement
-public class UserList extends MetadataItem {
-    public static final String ITEM_TYPE = "userList";
-    private static final long serialVersionUID = 1L;
-
-    public UserList() {
-    }
-
-    public UserList(Metadata metadata) {
-        super(metadata);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListService.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListService.java
 
b/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListService.java
deleted file mode 100644
index ff8d50d..0000000
--- 
a/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListService.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 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.jahia.unomi.services;
-
-import org.jahia.unomi.lists.UserList;
-import org.oasis_open.contextserver.api.Metadata;
-import org.oasis_open.contextserver.api.PartialList;
-import org.oasis_open.contextserver.api.query.Query;
-
-
-/**
- * @author Christophe Laprun
- */
-public interface UserListService {
-
-    PartialList<Metadata> getListMetadatas(int offset, int size, String 
sortBy);
-
-    PartialList<Metadata> getListMetadatas(Query query);
-
-    UserList load(String listId);
-
-    void save(UserList list);
-
-    void delete(String listId);
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListServiceImpl.java
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListServiceImpl.java
 
b/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListServiceImpl.java
deleted file mode 100644
index 54d85e8..0000000
--- 
a/extensions/lists-extension/services/src/main/java/org/jahia/unomi/services/UserListServiceImpl.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.jahia.unomi.services;
-
-import org.jahia.unomi.lists.UserList;
-import org.oasis_open.contextserver.api.Metadata;
-import org.oasis_open.contextserver.api.PartialList;
-import org.oasis_open.contextserver.api.Profile;
-import org.oasis_open.contextserver.api.conditions.Condition;
-import org.oasis_open.contextserver.api.query.Query;
-import org.oasis_open.contextserver.api.services.DefinitionsService;
-import org.oasis_open.contextserver.persistence.spi.PersistenceService;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Christophe Laprun
- */
-public class UserListServiceImpl implements UserListService {
-    private PersistenceService persistenceService;
-
-    private DefinitionsService definitionsService;
-
-    public void setPersistenceService(PersistenceService persistenceService) {
-        this.persistenceService = persistenceService;
-    }
-
-    public void setDefinitionsService(DefinitionsService definitionsService) {
-        this.definitionsService = definitionsService;
-    }
-
-    public PartialList<Metadata> getListMetadatas(int offset, int size, String 
sortBy) {
-        PartialList<UserList> userLists = 
persistenceService.getAllItems(UserList.class, offset, size, sortBy);
-        List<Metadata> metadata = new LinkedList<>();
-        for (UserList definition : userLists.getList()) {
-            metadata.add(definition.getMetadata());
-        }
-        return new PartialList<>(metadata, userLists.getOffset(), 
userLists.getPageSize(), userLists.getTotalSize());
-    }
-
-    public PartialList<Metadata> getListMetadatas(Query query) {
-        if(query.isForceRefresh()){
-            persistenceService.refresh();
-        }
-        definitionsService.resolveConditionType(query.getCondition());
-        PartialList<UserList> userLists = 
persistenceService.query(query.getCondition(), query.getSortby(), 
UserList.class, query.getOffset(), query.getLimit());
-        List<Metadata> metadata = new LinkedList<>();
-        for (UserList definition : userLists.getList()) {
-            metadata.add(definition.getMetadata());
-        }
-        return new PartialList<>(metadata, userLists.getOffset(), 
userLists.getPageSize(), userLists.getTotalSize());
-    }
-
-    @Override
-    public UserList load(String listId) {
-        return persistenceService.load(listId, UserList.class);
-    }
-
-    @Override
-    public void save(UserList list) {
-        persistenceService.save(list);
-    }
-
-    @Override
-    public void delete(String listId) {
-        Condition query = new 
Condition(definitionsService.getConditionType("profilePropertyCondition"));
-        query.setParameter("propertyName", "systemProperties.lists");
-        query.setParameter("comparisonOperator", "equals");
-        query.setParameter("propertyValue", listId);
-
-        List<Profile> profiles = persistenceService.query(query, null, 
Profile.class);
-        Map<String, Object> profileProps;
-        for (Profile p : profiles) {
-            profileProps = p.getSystemProperties();
-            if(profileProps != null && profileProps.get("lists") != null) {
-                int index = ((List) profileProps.get("lists")).indexOf(listId);
-                if(index != -1){
-                    ((List) profileProps.get("lists")).remove(index);
-                    persistenceService.update(p.getItemId(), null, 
Profile.class, "systemProperties", profileProps);
-                }
-            }
-        }
-
-        persistenceService.remove(listId, UserList.class);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/lists-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
----------------------------------------------------------------------
diff --git 
a/extensions/lists-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
 
b/extensions/lists-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
index 6556a79..9b1f44b 100644
--- 
a/extensions/lists-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
+++ 
b/extensions/lists-extension/services/src/main/resources/OSGI-INF/blueprint/blueprint.xml
@@ -20,14 +20,14 @@
            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd";>
 
     <reference id="persistenceService"
-               
interface="org.oasis_open.contextserver.persistence.spi.PersistenceService"/>
+               
interface="org.apache.unomi.persistence.spi.PersistenceService"/>
 
-    <reference id="definitionsService" 
interface="org.oasis_open.contextserver.api.services.DefinitionsService"/>
+    <reference id="definitionsService" 
interface="org.apache.unomi.api.services.DefinitionsService"/>
 
 
     <!-- User List service -->
 
-    <bean id="userListServiceImpl" 
class="org.jahia.unomi.services.UserListServiceImpl">
+    <bean id="userListServiceImpl" 
class="org.apache.unomi.services.UserListServiceImpl">
         <property name="persistenceService" ref="persistenceService"/>
         <property name="definitionsService" ref="definitionsService"/>
     </bean>

http://git-wip-us.apache.org/repos/asf/incubator-unomi/blob/dc1d1520/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
----------------------------------------------------------------------
diff --git 
a/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
 
b/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
new file mode 100644
index 0000000..45a6146
--- /dev/null
+++ 
b/extensions/privacy-extension/rest/src/main/java/org/apache/unomi/privacy/rest/PrivacyServiceEndPoint.java
@@ -0,0 +1,121 @@
+/*
+ * 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.unomi.privacy.rest;
+
+import org.apache.cxf.rs.security.cors.CrossOriginResourceSharing;
+import org.apache.unomi.api.ServerInfo;
+import org.apache.unomi.api.services.PrivacyService;
+
+import javax.jws.WebMethod;
+import javax.jws.WebService;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.NewCookie;
+import javax.ws.rs.core.Response;
+import java.util.List;
+
+/**
+ * REST API end point for privacy service
+ */
+@WebService
+@Produces(MediaType.APPLICATION_JSON)
+@CrossOriginResourceSharing(
+        allowAllOrigins = true,
+        allowCredentials = true
+)
+public class PrivacyServiceEndPoint {
+
+    private PrivacyService privacyService;
+
+    @WebMethod(exclude = true)
+    public void setPrivacyService(PrivacyService privacyService) {
+        this.privacyService = privacyService;
+    }
+
+    @GET
+    @Path("/info")
+    public ServerInfo getServerInfo() {
+        return privacyService.getServerInfo();
+    }
+
+    @DELETE
+    @Path("/profiles/{profileId}")
+    public Response deleteProfileData(@PathParam("profileId") String 
profileId, @QueryParam("withData") @DefaultValue("false") boolean withData) {
+        if (withData) {
+            privacyService.deleteProfileData(profileId);
+        } else {
+            privacyService.deleteProfile(profileId);
+        }
+        return Response.ok().build();
+    }
+
+    @POST
+    @Path("/profiles/{profileId}/anonymize")
+    public Response anonymizeBrowsingData(@PathParam("profileId") String 
profileId) {
+        String newProfileId = privacyService.anonymizeBrowsingData(profileId);
+        if (!profileId.equals(newProfileId)) {
+            return Response.ok()
+                    .cookie(new NewCookie("context-profile-id", newProfileId, 
"/", null, null, NewCookie.DEFAULT_MAX_AGE, false))
+                    .entity(newProfileId)
+                    .build();
+        }
+        return Response.serverError().build();
+    }
+
+    @GET
+    @Path("/profiles/{profileId}/anonymous")
+    public Boolean isAnonymous(@PathParam("profileId") String profileId) {
+        return privacyService.isAnonymous(profileId);
+    }
+
+    @POST
+    @Path("/profiles/{profileId}/anonymous")
+    public Response activateAnonymousSurfing(@PathParam("profileId") String 
profileId) {
+        privacyService.setAnonymous(profileId, true);
+        return Response.ok().build();
+    }
+
+    @DELETE
+    @Path("/profiles/{profileId}/anonymous")
+    public Response deactivateAnonymousSurfing(@PathParam("profileId") String 
profileId) {
+        privacyService.setAnonymous(profileId, false);
+        return Response.ok().build();
+    }
+
+    @GET
+    @Path("/profiles/{profileId}/eventFilters")
+    public List<String> getEventFilters(@PathParam("profileId") String 
profileId) {
+        return privacyService.getFilteredEventTypes(profileId);
+    }
+
+    @POST
+    @Consumes(MediaType.APPLICATION_JSON)
+    @Path("/profiles/{profileId}/eventFilters")
+    public Response setEventFilters(@PathParam("profileId") String profileId, 
List<String> eventFilters) {
+        privacyService.setFilteredEventTypes(profileId, eventFilters);
+        return Response.ok().build();
+    }
+
+    @DELETE
+    @Path("/profiles/{profileId}/properties/{propertyName}")
+    public Response removeProperty(@PathParam("profileId") String profileId, 
@PathParam("propertyName") String propertyName) {
+        privacyService.removeProperty(profileId, propertyName);
+        return Response.ok().build();
+    }
+
+}


Reply via email to