upgrading OSGi version
diff --git a/pom.xml b/pom.xml
index da88e77..5684dd6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -38,7 +38,7 @@
 
   <properties>
     <junit.version>5.3.1</junit.version>
-    <osgi.version>6.0.0</osgi.version>
+    <osgi.version>7.0.0</osgi.version>
     <slf4j.version>1.7.25</slf4j.version>
     <xbean.version>4.11</xbean.version>
 
@@ -55,7 +55,6 @@
     <module>winegrower-cepages</module>
     <module>winegrower-examples</module>
     <module>winegrower-documentation</module>
-    <!-- <module>winegrower-testing</module> -->
   </modules>
 
   <dependencies>
@@ -75,7 +74,12 @@
     <dependencies>
       <dependency>
         <groupId>org.osgi</groupId>
-        <artifactId>org.osgi.core</artifactId>
+        <artifactId>osgi.core</artifactId>
+        <version>${osgi.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>org.osgi</groupId>
+        <artifactId>osgi.cmpn</artifactId>
         <version>${osgi.version}</version>
       </dependency>
       <dependency>
diff --git a/winegrower-core/pom.xml b/winegrower-core/pom.xml
index 05d0383..bb6fc1a 100644
--- a/winegrower-core/pom.xml
+++ b/winegrower-core/pom.xml
@@ -40,12 +40,11 @@
   <dependencies>
     <dependency>
       <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.core</artifactId>
+      <artifactId>osgi.core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.osgi</groupId>
       <artifactId>osgi.cmpn</artifactId>
-      <version>${osgi.version}</version>
     </dependency>
     <dependency>
       <groupId>org.apache.xbean</groupId>
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java b/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java
index 7352a7b..d661e62 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/DefaultConfigurationAdmin.java
@@ -13,6 +13,7 @@
  */
 package org.apache.winegrower.service;
 
+import static java.util.Arrays.asList;
 import static java.util.Collections.list;
 import static java.util.Optional.ofNullable;
 import static java.util.function.Function.identity;
@@ -28,10 +29,12 @@
 import java.util.Date;
 import java.util.Dictionary;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Properties;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.winegrower.lang.Substitutor;
@@ -67,18 +70,28 @@
     }
 
     @Override
+    public Configuration getFactoryConfiguration(final String factoryPid, final String name, final String location) {
+        return getOrCreate(factoryPid, null, location, name);
+    }
+
+    @Override
+    public Configuration getFactoryConfiguration(final String factoryPid, final String name) {
+        return getOrCreate(factoryPid, null, null, name);
+    }
+
+    @Override
     public Configuration createFactoryConfiguration(final String pid) {
         return createFactoryConfiguration(pid, null);
     }
 
     @Override
     public Configuration createFactoryConfiguration(final String pid, final String location) {
-        return getOrCreate(pid, null, location);
+        return getOrCreate(pid, null, location, null);
     }
 
     @Override
     public Configuration getConfiguration(final String pid, final String location) {
-        return getOrCreate(null, pid, location);
+        return getOrCreate(null, pid, location, null);
     }
 
     @Override
@@ -97,14 +110,15 @@
         }
     }
 
-    private Configuration getOrCreate(final String factoryPid, final String pid, final String location) {
+    private Configuration getOrCreate(final String factoryPid, final String pid, final String location,
+                                      final String name) {
         final Key key = new Key(factoryPid, pid);
         final Configuration existing = configurations.get(key);
         if (existing != null) {
             return existing;
         }
         final DefaultConfiguration created = new DefaultConfiguration(providedConfiguration,
-                key.factoryPid, key.pid, location);
+                key.factoryPid, key.pid, location, name);
         configurations.putIfAbsent(key, created);
         onUpdate(created.factoryPid, created.pid); // after the put to ensure listConfiguration in a listener works
         return created;
@@ -130,18 +144,23 @@
 
         private final Map<String, String> configRegistry;
 
+        private final String name;
+
         private String location;
 
         private final Hashtable<String, Object> properties;
 
         private final AtomicLong changeCount = new AtomicLong();
 
+        private final Set<ConfigurationAttribute> attributes = new HashSet<>();
+
         private DefaultConfiguration(final Map<String, String> configRegistry, final String factoryPid, final String pid,
-                final String location) {
+                final String location, final String name) {
             this.configRegistry = configRegistry;
             this.factoryPid = factoryPid;
             this.pid = pid;
             this.location = location;
+            this.name = name;
             this.properties = new Hashtable<>();
             this.defaultExternalConfigLocation = new File(
                     // support a cascade of known "homes"
@@ -188,6 +207,7 @@
             // ensure the factoryPid/pid is there if exists
             ofNullable(pid).ifPresent(v -> properties.putIfAbsent("service.pid", v));
             ofNullable(factoryPid).ifPresent(v -> properties.putIfAbsent("service.factoryPid", v));
+            ofNullable(name).ifPresent(v -> properties.putIfAbsent("name", v));
         }
 
         @Override
@@ -201,6 +221,11 @@
         }
 
         @Override
+        public Dictionary<String, Object> getProcessedProperties(final ServiceReference<?> reference) {
+            return reference.getProperties();
+        }
+
+        @Override
         public void update(final Dictionary<String, ?> properties) {
             this.properties.clear();
             loadConfig(pid);
@@ -234,6 +259,16 @@
         }
 
         @Override
+        public boolean updateIfDifferent(final Dictionary<String, ?> properties) {
+            if (properties == null || list(properties.keys()).stream()
+                    .anyMatch(it -> !properties.get(it).equals(this.properties.get(it)))) {
+                update(properties);
+                return true;
+            }
+            return false;
+        }
+
+        @Override
         public void setBundleLocation(final String location) {
             this.location = location;
         }
@@ -248,6 +283,21 @@
             return changeCount.get();
         }
 
+        @Override
+        public void addAttributes(final ConfigurationAttribute... attrs) {
+            ofNullable(attrs).ifPresent(values -> attributes.addAll(asList(attrs)));
+        }
+
+        @Override
+        public Set<ConfigurationAttribute> getAttributes() {
+            return attributes;
+        }
+
+        @Override
+        public void removeAttributes(ConfigurationAttribute... attrs) throws IOException {
+            ofNullable(attrs).ifPresent(values -> attributes.removeAll(asList(attrs)));
+        }
+
         private Map<String, String> converter(final Dictionary<String, ?> properties) {
             return list(properties.keys()).stream().collect(toMap(identity(), it -> properties.get(it).toString()));
         }
@@ -297,5 +347,10 @@
         public int hashCode() {
             return hash;
         }
+
+        @Override
+        public String toString() {
+            return "Key{factoryPid='" + factoryPid + "', pid='" + pid + "'}";
+        }
     }
 }
diff --git a/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java b/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java
index 21e5953..4184e1d 100644
--- a/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java
+++ b/winegrower-core/src/main/java/org/apache/winegrower/service/ServiceReferenceImpl.java
@@ -22,14 +22,14 @@
 import org.osgi.framework.ServiceReference;
 
 public class ServiceReferenceImpl<T> implements ServiceReference<T> {
-    private final Dictionary<String, ?> properties;
+    private final Dictionary<String, Object> properties;
     private final Bundle bundle;
     private final Bundle[] usingBundles = new Bundle[0];
     private final Object reference;
     private final boolean usesFactory;
     private ServiceRegistrationImpl registration;
 
-    ServiceReferenceImpl(final Dictionary<String, ?> properties, final Bundle bundle, final Object reference) {
+    ServiceReferenceImpl(final Dictionary<String, Object> properties, final Bundle bundle, final Object reference) {
         this.properties = properties;
         this.bundle = bundle;
         this.usesFactory = ServiceFactory.class.isInstance(reference);
@@ -88,6 +88,11 @@
         return System.identityHashCode(this.reference) - System.identityHashCode(reference);
     }
 
+    @Override
+    public Dictionary<String, Object> getProperties() {
+        return properties;
+    }
+
     public boolean unget() {
         if (usesFactory) {
             throw new UnsupportedOperationException();
diff --git a/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java b/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java
index 86862b9..4751fc5 100644
--- a/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java
+++ b/winegrower-core/src/test/java/org/apache/winegrower/RipenerTest.java
@@ -85,13 +85,13 @@
     @Test
     @WithRipener
     void ensureFrameworkBundle(@Service final Ripener ripener) {
-        assertEquals(2, ripener.getRegistry().getBundles().size());
+        assertEquals(3, ripener.getRegistry().getBundles().size());
     }
 
     @Test
     @WithRipener(includeResources = @Entry(path = "org.apache.winegrower.test.simpleactivator"))
     void simpleActivator(@Service final Ripener ripener) {
-        assertEquals(3, ripener.getRegistry().getBundles().size());
+        assertEquals(4, ripener.getRegistry().getBundles().size());
 
         final BundleActivatorHandler activatorHandler = ripener.getRegistry().getBundles().values().stream()
                 .filter(it -> it.getActivator() != null)
diff --git a/winegrower-examples/bundle/pom.xml b/winegrower-examples/bundle/pom.xml
index 2a2de3e..22ca6f0 100644
--- a/winegrower-examples/bundle/pom.xml
+++ b/winegrower-examples/bundle/pom.xml
@@ -40,7 +40,7 @@
   <dependencies>
     <dependency>
       <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.core</artifactId>
+      <artifactId>osgi.core</artifactId>
     </dependency>
 
     <!-- test -->
diff --git a/winegrower-examples/config/pom.xml b/winegrower-examples/config/pom.xml
index 5781dfd..41e3909 100644
--- a/winegrower-examples/config/pom.xml
+++ b/winegrower-examples/config/pom.xml
@@ -41,12 +41,11 @@
   <dependencies>
     <dependency>
       <groupId>org.osgi</groupId>
-      <artifactId>org.osgi.core</artifactId>
+      <artifactId>osgi.core</artifactId>
     </dependency>
     <dependency>
       <groupId>org.osgi</groupId>
       <artifactId>osgi.cmpn</artifactId>
-      <version>6.0.0</version>
     </dependency>
 
     <!-- test -->
diff --git a/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/BuildTest.java b/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/BuildTest.java
index 47e1f21..99402b6 100644
--- a/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/BuildTest.java
+++ b/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/BuildTest.java
@@ -62,7 +62,7 @@
         assertEquals(11, entries.size());
         assertTrue(entries.contains("test-art-winegrower-distribution/bin/winegrower.sh"));
         assertTrue(entries.contains("test-art-winegrower-distribution/bin/setenv.sh"));
-        assertTrue(entries.contains("test-art-winegrower-distribution/lib/org.osgi.core-6.0.0.jar"));
+        assertTrue(entries.contains("test-art-winegrower-distribution/lib/osgi.core-7.0.0.jar"));
         assertTrue(entries.contains("test-art-winegrower-distribution/lib/junit-jupiter-api-5.3.1.jar"));
     }
 }
diff --git a/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java b/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java
index b41c05b..f31cb88 100644
--- a/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java
+++ b/winegrower-extension/winegrower-build/winegrower-build-common/src/test/java/org/apache/winegrower/extension/build/common/FatJarTest.java
@@ -49,7 +49,7 @@
         try (final JarFile files = new JarFile(output)) {
             entries = list(files.entries()).stream().map(JarEntry::getName).collect(toList());
         }
-        assertTrue(entries.size() > 500); // 503 when writing this test
+        assertTrue(entries.size() > 450); // 481 when writing this test
         // ensure junit and osgi-core are here by testing a few known classes
         assertTrue(entries.contains("org/junit/jupiter/api/AfterAll.class"));
         assertTrue(entries.contains("org/osgi/framework/FrameworkUtil.class"));