Repository: Unleash/unleash-client-java
Pull request #140 (2021-06-10 11:31:45)

Task/new package
I've tried to leave old classes in place annotated with deprecated and javadoc for which class one should use instead. 

I think I've readded most of the classes/interfaces that are in use in the `no.finn.unleash` package and made them subtypes of their respective `io.getunleash` class/interface.

However
If @checketts or @ivarconr or anyone else can see a class they know they use and would like to not have to instantiate twice that is not already a subtype of it's new package location, feel free to add suggestions to this PR


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 94f1663c..225992e0 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,12 @@
 # Changelog
+
+
+## 5.0.0
+- chore: Refactor package names. Moving from `no.finn.unleash` to `io.getunleash` to reflect where development is taking place.
+
 ## 4.4.0
 - feat: Add support for custom stickiness (#132)
+
 ## 4.3.0
 - feat: Add support for leveraging namePrefix in Java SDK (#135)
 - feat: Adding support for custom proxy (#137)
diff --git a/README.md b/README.md
index 29802ecf..e85720d6 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ You will require unleash on your class path, pop it in to your pom:
 
 ```xml
 <dependency>
-    <groupId>no.finn.unleash</groupId>
+    <groupId>io.getunleash</groupId>
     <artifactId>unleash-client-java</artifactId>
     <version>Latest version here</version>
 </dependency>
@@ -168,7 +168,7 @@ UnleashConfig unleashConfig = UnleashConfig.builder()
 ### Subscriber API
 *(Introduced in 3.2.2)*
 
-Sometimes you want to know when Unleash updates internally. This can be achieved by registering a subscriber. An example on how to configure a custom subscriber is shown below. Have a look at [UnleashSubscriber.java](https://github.com/Unleash/unleash-client-java/blob/master/src/main/java/no/finn/unleash/event/UnleashSubscriber.java) to get a complete overview of all methods you can override.
+Sometimes you want to know when Unleash updates internally. This can be achieved by registering a subscriber. An example on how to configure a custom subscriber is shown below. Have a look at [UnleashSubscriber.java](https://github.com/Unleash/unleash-client-java/blob/master/src/main/java/io/getunleash/event/UnleashSubscriber.java) to get a complete overview of all methods you can override.
 
 
 ```java
@@ -272,7 +272,7 @@ fakeUnleash.setVariant("t1", new Variant("a", (String) null, true));
 assertThat(fakeUnleash.getVariant("t1").getName(), is("a"));
 ```
 
-Se more in [FakeUnleashTest.java](https://github.com/Unleash/unleash-client-java/blob/master/src/test/java/no/finn/unleash/FakeUnleashTest.java)
+Se more in [FakeUnleashTest.java](https://github.com/Unleash/unleash-client-java/blob/master/src/test/java/io/getunleash/FakeUnleashTest.java)
 
 ## Development
 
@@ -300,7 +300,7 @@ The generated report will be available at ```target/site/jacoco/index.html```
 
 ## Deployment
  - You'll need an account with Sonatype's JIRA - https://issues.sonatype.org
- - In addition your account needs access to publish under no.finn (for now, we'll be moving to our own groupId soon)
+ - In addition your account needs access to publish under io.getunleash
 ## GPG signing
  - You'll need gpg installed and a configured gpg key for signing the artifacts
 ### Example settings.xml
diff --git a/pom.xml b/pom.xml
index 7be32ec4..28fc98e5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <groupId>no.finn.unleash</groupId>
+    <groupId>io.getunleash</groupId>
     <artifactId>unleash-client-java</artifactId>
     <version>4.4.1-SNAPSHOT</version>
 
@@ -14,7 +14,7 @@
         <arguments />
     </properties>
 
-    <name>no.finn.unleash:unleash-client-java</name>
+    <name>io.getunleash:unleash-client-java</name>
     <description>A client library for Unleash</description>
     <url>http://github.com/Unleash/unleash-client-java</url>
     <inceptionYear>2014</inceptionYear>
diff --git a/src/main/java/no/finn/unleash/ActivationStrategy.java b/src/main/java/io/getunleash/ActivationStrategy.java
similarity index 97%
rename from src/main/java/no/finn/unleash/ActivationStrategy.java
rename to src/main/java/io/getunleash/ActivationStrategy.java
index 510dad70..759a7948 100644
--- a/src/main/java/no/finn/unleash/ActivationStrategy.java
+++ b/src/main/java/io/getunleash/ActivationStrategy.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import java.util.Collections;
 import java.util.List;
diff --git a/src/main/java/no/finn/unleash/Constraint.java b/src/main/java/io/getunleash/Constraint.java
similarity index 95%
rename from src/main/java/no/finn/unleash/Constraint.java
rename to src/main/java/io/getunleash/Constraint.java
index 3cfb4934..311fd920 100644
--- a/src/main/java/no/finn/unleash/Constraint.java
+++ b/src/main/java/io/getunleash/Constraint.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import java.util.List;
 
diff --git a/src/main/java/no/finn/unleash/CustomHttpHeadersProvider.java b/src/main/java/io/getunleash/CustomHttpHeadersProvider.java
similarity index 82%
rename from src/main/java/no/finn/unleash/CustomHttpHeadersProvider.java
rename to src/main/java/io/getunleash/CustomHttpHeadersProvider.java
index bcc44872..02250099 100644
--- a/src/main/java/no/finn/unleash/CustomHttpHeadersProvider.java
+++ b/src/main/java/io/getunleash/CustomHttpHeadersProvider.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import java.util.Map;
 
diff --git a/src/main/java/no/finn/unleash/DefaultCustomHttpHeadersProviderImpl.java b/src/main/java/io/getunleash/DefaultCustomHttpHeadersProviderImpl.java
similarity index 90%
rename from src/main/java/no/finn/unleash/DefaultCustomHttpHeadersProviderImpl.java
rename to src/main/java/io/getunleash/DefaultCustomHttpHeadersProviderImpl.java
index 419239cc..6d6ebfdd 100644
--- a/src/main/java/no/finn/unleash/DefaultCustomHttpHeadersProviderImpl.java
+++ b/src/main/java/io/getunleash/DefaultCustomHttpHeadersProviderImpl.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/src/main/java/io/getunleash/DefaultUnleash.java b/src/main/java/io/getunleash/DefaultUnleash.java
new file mode 100644
index 00000000..60854949
--- /dev/null
+++ b/src/main/java/io/getunleash/DefaultUnleash.java
@@ -0,0 +1,291 @@
+package io.getunleash;
+
+import static io.getunleash.Variant.DISABLED_VARIANT;
+import static java.util.Optional.ofNullable;
+
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.event.ToggleEvaluated;
+import io.getunleash.lang.Nullable;
+import io.getunleash.metric.UnleashMetricService;
+import io.getunleash.metric.UnleashMetricServiceImpl;
+import io.getunleash.repository.FeatureToggleRepository;
+import io.getunleash.repository.HttpToggleFetcher;
+import io.getunleash.repository.ToggleBackupHandlerFile;
+import io.getunleash.repository.ToggleRepository;
+import io.getunleash.strategy.*;
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.variant.VariantUtil;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultUnleash implements Unleash {
+    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultUnleash.class);
+    private static final List<Strategy> BUILTIN_STRATEGIES =
+            Arrays.asList(
+                    new DefaultStrategy(),
+                    new ApplicationHostnameStrategy(),
+                    new GradualRolloutRandomStrategy(),
+                    new GradualRolloutSessionIdStrategy(),
+                    new GradualRolloutUserIdStrategy(),
+                    new RemoteAddressStrategy(),
+                    new UserWithIdStrategy(),
+                    new FlexibleRolloutStrategy());
+
+    public static final UnknownStrategy UNKNOWN_STRATEGY = new UnknownStrategy();
+
+    private final UnleashMetricService metricService;
+    private final ToggleRepository toggleRepository;
+    private final Map<String, Strategy> strategyMap;
+    private final UnleashContextProvider contextProvider;
+    private final EventDispatcher eventDispatcher;
+    private final UnleashConfig config;
+
+    private static FeatureToggleRepository defaultToggleRepository(UnleashConfig unleashConfig) {
+        return new FeatureToggleRepository(
+                unleashConfig,
+                new HttpToggleFetcher(unleashConfig),
+                new ToggleBackupHandlerFile(unleashConfig));
+    }
+
+    public DefaultUnleash(UnleashConfig unleashConfig, Strategy... strategies) {
+        this(unleashConfig, defaultToggleRepository(unleashConfig), strategies);
+    }
+
+    public DefaultUnleash(
+            UnleashConfig unleashConfig,
+            ToggleRepository toggleRepository,
+            Strategy... strategies) {
+        this(
+                unleashConfig,
+                toggleRepository,
+                buildStrategyMap(strategies),
+                unleashConfig.getContextProvider(),
+                new EventDispatcher(unleashConfig),
+                new UnleashMetricServiceImpl(unleashConfig, unleashConfig.getScheduledExecutor()));
+    }
+
+    // Visible for testing
+    public DefaultUnleash(
+            UnleashConfig unleashConfig,
+            ToggleRepository toggleRepository,
+            Map<String, Strategy> strategyMap,
+            UnleashContextProvider contextProvider,
+            EventDispatcher eventDispatcher,
+            UnleashMetricService metricService) {
+        this.config = unleashConfig;
+        this.toggleRepository = toggleRepository;
+        this.strategyMap = strategyMap;
+        this.contextProvider = contextProvider;
+        this.eventDispatcher = eventDispatcher;
+        this.metricService = metricService;
+        metricService.register(strategyMap.keySet());
+    }
+
+    @Override
+    public boolean isEnabled(final String toggleName) {
+        return isEnabled(toggleName, false);
+    }
+
+    @Override
+    public boolean isEnabled(final String toggleName, final boolean defaultSetting) {
+        return isEnabled(toggleName, contextProvider.getContext(), defaultSetting);
+    }
+
+    @Override
+    public boolean isEnabled(
+            final String toggleName, final UnleashContext context, final boolean defaultSetting) {
+        return isEnabled(toggleName, context, (n, c) -> defaultSetting);
+    }
+
+    @Override
+    public boolean isEnabled(
+            final String toggleName,
+            final BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        return isEnabled(toggleName, contextProvider.getContext(), fallbackAction);
+    }
+
+    @Override
+    public boolean isEnabled(
+            String toggleName,
+            UnleashContext context,
+            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        boolean enabled = checkEnabled(toggleName, context, fallbackAction);
+        count(toggleName, enabled);
+        eventDispatcher.dispatch(new ToggleEvaluated(toggleName, enabled));
+        return enabled;
+    }
+
+    private boolean checkEnabled(
+            String toggleName,
+            UnleashContext context,
+            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        checkIfToggleMatchesNamePrefix(toggleName);
+        FeatureToggle featureToggle = toggleRepository.getToggle(toggleName);
+        boolean enabled;
+        UnleashContext enhancedContext = context.applyStaticFields(config);
+
+        if (featureToggle == null) {
+            enabled = fallbackAction.apply(toggleName, enhancedContext);
+        } else if (!featureToggle.isEnabled()) {
+            enabled = false;
+        } else if (featureToggle.getStrategies().size() == 0) {
+            return true;
+        } else {
+            enabled =
+                    featureToggle.getStrategies().stream()
+                            .anyMatch(
+                                    strategy -> {
+                                        Strategy configuredStrategy =
+                                                getStrategy(strategy.getName());
+                                        if (configuredStrategy == UNKNOWN_STRATEGY) {
+                                            LOGGER.warn(
+                                                    "Unable to find matching strategy for toggle:{} strategy:{}",
+                                                    toggleName,
+                                                    strategy.getName());
+                                        }
+
+                                        return configuredStrategy.isEnabled(
+                                                strategy.getParameters(),
+                                                enhancedContext,
+                                                strategy.getConstraints());
+                                    });
+        }
+        return enabled;
+    }
+
+    private void checkIfToggleMatchesNamePrefix(String toggleName) {
+        if (config.getNamePrefix() != null) {
+            if (!toggleName.startsWith(config.getNamePrefix())) {
+                LOGGER.warn(
+                        "Toggle [{}] doesnt start with configured name prefix of [{}] so it will always be disabled",
+                        toggleName,
+                        config.getNamePrefix());
+            }
+        }
+    }
+
+    @Override
+    public Variant getVariant(String toggleName, UnleashContext context) {
+        return getVariant(toggleName, context, DISABLED_VARIANT);
+    }
+
+    @Override
+    public Variant getVariant(String toggleName, UnleashContext context, Variant defaultValue) {
+        FeatureToggle featureToggle = toggleRepository.getToggle(toggleName);
+        boolean enabled = checkEnabled(toggleName, context, (n, c) -> false);
+        Variant variant =
+                enabled
+                        ? VariantUtil.selectVariant(featureToggle, context, defaultValue)
+                        : defaultValue;
+        metricService.countVariant(toggleName, variant.getName());
+        return variant;
+    }
+
+    @Override
+    public Variant getVariant(String toggleName) {
+        return getVariant(toggleName, contextProvider.getContext());
+    }
+
+    @Override
+    public Variant getVariant(String toggleName, Variant defaultValue) {
+        return getVariant(toggleName, contextProvider.getContext(), defaultValue);
+    }
+
+    public Optional<FeatureToggle> getFeatureToggleDefinition(String toggleName) {
+        return ofNullable(toggleRepository.getToggle(toggleName));
+    }
+
+    /**
+     * Use more().getFeatureToggleNames() instead
+     *
+     * @return a list of known toggle names
+     */
+    @Deprecated()
+    public List<String> getFeatureToggleNames() {
+        return toggleRepository.getFeatureNames();
+    }
+
+    /** Use more().count() instead */
+    @Deprecated
+    public void count(final String toggleName, boolean enabled) {
+        metricService.count(toggleName, enabled);
+    }
+
+    private static Map<String, Strategy> buildStrategyMap(@Nullable Strategy[] strategies) {
+        Map<String, Strategy> map = new HashMap<>();
+
+        BUILTIN_STRATEGIES.forEach(strategy -> map.put(strategy.getName(), strategy));
+
+        if (strategies != null) {
+            for (Strategy strategy : strategies) {
+                map.put(strategy.getName(), strategy);
+            }
+        }
+
+        return map;
+    }
+
+    private Strategy getStrategy(String strategy) {
+        return strategyMap.getOrDefault(strategy, config.getFallbackStrategy());
+    }
+
+    @Override
+    public void shutdown() {
+        config.getScheduledExecutor().shutdown();
+    }
+
+    @Override
+    public MoreOperations more() {
+        return new DefaultMore();
+    }
+
+    public class DefaultMore implements MoreOperations {
+
+        @Override
+        public List<String> getFeatureToggleNames() {
+            return toggleRepository.getFeatureNames();
+        }
+
+        @Override
+        public List<EvaluatedToggle> evaluateAllToggles() {
+            return evaluateAllToggles(contextProvider.getContext());
+        }
+
+        @Override
+        public List<EvaluatedToggle> evaluateAllToggles(UnleashContext context) {
+            return getFeatureToggleNames().stream()
+                    .map(
+                            toggleName -> {
+                                boolean enabled =
+                                        checkEnabled(toggleName, context, (n, c) -> false);
+                                FeatureToggle featureToggle =
+                                        toggleRepository.getToggle(toggleName);
+                                Variant variant =
+                                        enabled
+                                                ? VariantUtil.selectVariant(
+                                                        featureToggle, context, DISABLED_VARIANT)
+                                                : DISABLED_VARIANT;
+
+                                return new EvaluatedToggle(toggleName, enabled, variant);
+                            })
+                    .collect(Collectors.toList());
+        }
+
+        @Override
+        public void count(final String toggleName, boolean enabled) {
+            metricService.count(toggleName, enabled);
+        }
+
+        @Override
+        public void countVariant(final String toggleName, String variantName) {
+            metricService.countVariant(toggleName, variantName);
+        }
+    }
+}
diff --git a/src/main/java/no/finn/unleash/EvaluatedToggle.java b/src/main/java/io/getunleash/EvaluatedToggle.java
similarity index 89%
rename from src/main/java/no/finn/unleash/EvaluatedToggle.java
rename to src/main/java/io/getunleash/EvaluatedToggle.java
index b637e30c..08949102 100644
--- a/src/main/java/no/finn/unleash/EvaluatedToggle.java
+++ b/src/main/java/io/getunleash/EvaluatedToggle.java
@@ -1,6 +1,6 @@
-package no.finn.unleash;
+package io.getunleash;
 
-import no.finn.unleash.lang.Nullable;
+import io.getunleash.lang.Nullable;
 
 public class EvaluatedToggle {
     private final boolean enabled;
diff --git a/src/main/java/io/getunleash/FakeUnleash.java b/src/main/java/io/getunleash/FakeUnleash.java
new file mode 100644
index 00000000..b7eb06b2
--- /dev/null
+++ b/src/main/java/io/getunleash/FakeUnleash.java
@@ -0,0 +1,158 @@
+package io.getunleash;
+
+import io.getunleash.lang.Nullable;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+
+public class FakeUnleash implements Unleash {
+    private boolean enableAll = false;
+    private boolean disableAll = false;
+    private Map<String, Boolean> features = new HashMap<>();
+    private Map<String, Variant> variants = new HashMap<>();
+
+    @Override
+    public boolean isEnabled(String toggleName) {
+        return isEnabled(toggleName, false);
+    }
+
+    @Override
+    public boolean isEnabled(String toggleName, boolean defaultSetting) {
+        if (enableAll) {
+            return true;
+        } else if (disableAll) {
+            return false;
+        } else {
+            return features.getOrDefault(toggleName, defaultSetting);
+        }
+    }
+
+    @Override
+    public boolean isEnabled(
+            String toggleName,
+            UnleashContext context,
+            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        return isEnabled(toggleName, fallbackAction);
+    }
+
+    @Override
+    public boolean isEnabled(
+            String toggleName, BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        if (!features.containsKey(toggleName)) {
+            return fallbackAction.apply(toggleName, UnleashContext.builder().build());
+        }
+        return isEnabled(toggleName);
+    }
+
+    @Override
+    public Variant getVariant(String toggleName, UnleashContext context) {
+        return getVariant(toggleName, Variant.DISABLED_VARIANT);
+    }
+
+    @Override
+    public Variant getVariant(String toggleName, UnleashContext context, Variant defaultValue) {
+        return getVariant(toggleName, defaultValue);
+    }
+
+    @Override
+    public Variant getVariant(String toggleName) {
+        return getVariant(toggleName, Variant.DISABLED_VARIANT);
+    }
+
+    @Override
+    public Variant getVariant(String toggleName, Variant defaultValue) {
+        if (isEnabled(toggleName) && variants.containsKey(toggleName)) {
+            return variants.get(toggleName);
+        } else {
+            return defaultValue;
+        }
+    }
+
+    @Override
+    public List<String> getFeatureToggleNames() {
+        return more().getFeatureToggleNames();
+    }
+
+    @Override
+    public MoreOperations more() {
+        return new FakeMore();
+    }
+
+    public void enableAll() {
+        disableAll = false;
+        enableAll = true;
+        features.clear();
+    }
+
+    public void disableAll() {
+        disableAll = true;
+        enableAll = false;
+        features.clear();
+    }
+
+    public void resetAll() {
+        disableAll = false;
+        enableAll = false;
+        features.clear();
+        variants.clear();
+    }
+
+    public void enable(String... features) {
+        for (String name : features) {
+            this.features.put(name, true);
+        }
+    }
+
+    public void disable(String... features) {
+        for (String name : features) {
+            this.features.put(name, false);
+        }
+    }
+
+    public void reset(String... features) {
+        for (String name : features) {
+            this.features.remove(name);
+        }
+    }
+
+    public void setVariant(String t1, Variant a) {
+        variants.put(t1, a);
+    }
+
+    public class FakeMore implements MoreOperations {
+
+        @Override
+        public List<String> getFeatureToggleNames() {
+            return new ArrayList<>(features.keySet());
+        }
+
+        @Override
+        public List<EvaluatedToggle> evaluateAllToggles() {
+            return evaluateAllToggles(null);
+        }
+
+        @Override
+        public List<EvaluatedToggle> evaluateAllToggles(@Nullable UnleashContext context) {
+            return getFeatureToggleNames().stream()
+                    .map(
+                            toggleName -> {
+                                return new EvaluatedToggle(
+                                        toggleName, isEnabled(toggleName), getVariant(toggleName));
+                            })
+                    .collect(Collectors.toList());
+        }
+
+        @Override
+        public void count(String toggleName, boolean enabled) {
+            // Nothing to count
+        }
+
+        @Override
+        public void countVariant(String toggleName, String variantName) {
+            // Nothing to count
+        }
+    }
+}
diff --git a/src/main/java/no/finn/unleash/FeatureToggle.java b/src/main/java/io/getunleash/FeatureToggle.java
similarity index 93%
rename from src/main/java/no/finn/unleash/FeatureToggle.java
rename to src/main/java/io/getunleash/FeatureToggle.java
index 41f6e649..a76081c4 100644
--- a/src/main/java/no/finn/unleash/FeatureToggle.java
+++ b/src/main/java/io/getunleash/FeatureToggle.java
@@ -1,11 +1,11 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import static java.util.Collections.emptyList;
 
+import io.getunleash.lang.Nullable;
+import io.getunleash.variant.VariantDefinition;
 import java.util.Collections;
 import java.util.List;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.variant.VariantDefinition;
 
 public final class FeatureToggle {
     private final String name;
diff --git a/src/main/java/no/finn/unleash/MoreOperations.java b/src/main/java/io/getunleash/MoreOperations.java
similarity index 95%
rename from src/main/java/no/finn/unleash/MoreOperations.java
rename to src/main/java/io/getunleash/MoreOperations.java
index 86a4cc87..a02d1058 100644
--- a/src/main/java/no/finn/unleash/MoreOperations.java
+++ b/src/main/java/io/getunleash/MoreOperations.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import java.util.List;
 
diff --git a/src/main/java/no/finn/unleash/Operator.java b/src/main/java/io/getunleash/Operator.java
similarity index 64%
rename from src/main/java/no/finn/unleash/Operator.java
rename to src/main/java/io/getunleash/Operator.java
index 92f8ea69..045ff9f0 100644
--- a/src/main/java/no/finn/unleash/Operator.java
+++ b/src/main/java/io/getunleash/Operator.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 public enum Operator {
     IN,
diff --git a/src/main/java/io/getunleash/Unleash.java b/src/main/java/io/getunleash/Unleash.java
new file mode 100644
index 00000000..2c663bc9
--- /dev/null
+++ b/src/main/java/io/getunleash/Unleash.java
@@ -0,0 +1,51 @@
+package io.getunleash;
+
+import java.util.List;
+import java.util.function.BiFunction;
+
+public interface Unleash {
+    boolean isEnabled(String toggleName);
+
+    boolean isEnabled(String toggleName, boolean defaultSetting);
+
+    default boolean isEnabled(String toggleName, UnleashContext context) {
+        return isEnabled(toggleName, context, false);
+    }
+
+    default boolean isEnabled(String toggleName, UnleashContext context, boolean defaultSetting) {
+        return isEnabled(toggleName, defaultSetting);
+    }
+
+    default boolean isEnabled(
+            String toggleName, BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        return isEnabled(toggleName, false);
+    }
+
+    default boolean isEnabled(
+            String toggleName,
+            UnleashContext context,
+            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
+        return isEnabled(toggleName, context, false);
+    }
+
+    Variant getVariant(final String toggleName, final UnleashContext context);
+
+    Variant getVariant(
+            final String toggleName, final UnleashContext context, final Variant defaultValue);
+
+    Variant getVariant(final String toggleName);
+
+    Variant getVariant(final String toggleName, final Variant defaultValue);
+
+    /**
+     * Use more().getFeatureToggleNames() instead
+     *
+     * @return a list of known toggle names
+     */
+    @Deprecated()
+    List<String> getFeatureToggleNames();
+
+    default void shutdown() {}
+
+    MoreOperations more();
+}
diff --git a/src/main/java/io/getunleash/UnleashContext.java b/src/main/java/io/getunleash/UnleashContext.java
new file mode 100644
index 00000000..f4edff21
--- /dev/null
+++ b/src/main/java/io/getunleash/UnleashContext.java
@@ -0,0 +1,149 @@
+package io.getunleash;
+
+import io.getunleash.lang.Nullable;
+import io.getunleash.util.UnleashConfig;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+public class UnleashContext {
+    private final Optional<String> appName;
+    private final Optional<String> environment;
+    private final Optional<String> userId;
+    private final Optional<String> sessionId;
+    private final Optional<String> remoteAddress;
+
+    private final Map<String, String> properties;
+
+    public UnleashContext(
+            String userId, String sessionId, String remoteAddress, Map<String, String> properties) {
+        this(null, null, userId, sessionId, remoteAddress, properties);
+    }
+
+    public UnleashContext(
+            @Nullable String appName,
+            @Nullable String environment,
+            @Nullable String userId,
+            @Nullable String sessionId,
+            @Nullable String remoteAddress,
+            Map<String, String> properties) {
+        this.appName = Optional.ofNullable(appName);
+        this.environment = Optional.ofNullable(environment);
+        this.userId = Optional.ofNullable(userId);
+        this.sessionId = Optional.ofNullable(sessionId);
+        this.remoteAddress = Optional.ofNullable(remoteAddress);
+        this.properties = properties;
+    }
+
+    public Optional<String> getUserId() {
+        return userId;
+    }
+
+    public Optional<String> getSessionId() {
+        return sessionId;
+    }
+
+    public Optional<String> getRemoteAddress() {
+        return remoteAddress;
+    }
+
+    public Map<String, String> getProperties() {
+        return properties;
+    }
+
+    public Optional<String> getAppName() {
+        return appName;
+    }
+
+    public Optional<String> getEnvironment() {
+        return environment;
+    }
+
+    public Optional<String> getByName(String contextName) {
+        switch (contextName) {
+            case "environment":
+                return environment;
+            case "appName":
+                return appName;
+            case "userId":
+                return userId;
+            case "sessionId":
+                return sessionId;
+            case "remoteAddress":
+                return remoteAddress;
+            default:
+                return Optional.ofNullable(properties.get(contextName));
+        }
+    }
+
+    public UnleashContext applyStaticFields(UnleashConfig config) {
+        Builder builder = new Builder(this);
+        if (!this.environment.isPresent()) {
+            builder.environment(config.getEnvironment());
+        }
+        if (!this.appName.isPresent()) {
+            builder.appName(config.getAppName());
+        }
+        return builder.build();
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static class Builder {
+        @Nullable private String appName;
+        @Nullable private String environment;
+        @Nullable private String userId;
+        @Nullable private String sessionId;
+        @Nullable private String remoteAddress;
+
+        private final Map<String, String> properties = new HashMap<>();
+
+        public Builder() {}
+
+        public Builder(UnleashContext context) {
+            context.appName.ifPresent(val -> this.appName = val);
+            context.environment.ifPresent(val -> this.environment = val);
+            context.userId.ifPresent(val -> this.userId = val);
+            context.sessionId.ifPresent(val -> this.sessionId = val);
+            context.remoteAddress.ifPresent(val -> this.remoteAddress = val);
+            context.properties.forEach(this.properties::put);
+        }
+
+        public Builder appName(String appName) {
+            this.appName = appName;
+            return this;
+        }
+
+        public Builder environment(String environment) {
+            this.environment = environment;
+            return this;
+        }
+
+        public Builder userId(String userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public Builder sessionId(String sessionId) {
+            this.sessionId = sessionId;
+            return this;
+        }
+
+        public Builder remoteAddress(String remoteAddress) {
+            this.remoteAddress = remoteAddress;
+            return this;
+        }
+
+        public Builder addProperty(String name, String value) {
+            properties.put(name, value);
+            return this;
+        }
+
+        public UnleashContext build() {
+            return new UnleashContext(
+                    appName, environment, userId, sessionId, remoteAddress, properties);
+        }
+    }
+}
diff --git a/src/main/java/io/getunleash/UnleashContextProvider.java b/src/main/java/io/getunleash/UnleashContextProvider.java
new file mode 100644
index 00000000..17e7fc14
--- /dev/null
+++ b/src/main/java/io/getunleash/UnleashContextProvider.java
@@ -0,0 +1,9 @@
+package io.getunleash;
+
+public interface UnleashContextProvider {
+    UnleashContext getContext();
+
+    static UnleashContextProvider getDefaultProvider() {
+        return () -> UnleashContext.builder().build();
+    }
+}
diff --git a/src/main/java/no/finn/unleash/UnleashException.java b/src/main/java/io/getunleash/UnleashException.java
similarity index 67%
rename from src/main/java/no/finn/unleash/UnleashException.java
rename to src/main/java/io/getunleash/UnleashException.java
index 0b42bfca..345bb88c 100644
--- a/src/main/java/no/finn/unleash/UnleashException.java
+++ b/src/main/java/io/getunleash/UnleashException.java
@@ -1,8 +1,8 @@
-package no.finn.unleash;
+package io.getunleash;
 
-import no.finn.unleash.event.UnleashEvent;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.lang.Nullable;
+import io.getunleash.event.UnleashEvent;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.lang.Nullable;
 
 public class UnleashException extends RuntimeException implements UnleashEvent {
 
diff --git a/src/main/java/no/finn/unleash/Variant.java b/src/main/java/io/getunleash/Variant.java
similarity index 95%
rename from src/main/java/no/finn/unleash/Variant.java
rename to src/main/java/io/getunleash/Variant.java
index 5ebd652f..2d8e2760 100644
--- a/src/main/java/no/finn/unleash/Variant.java
+++ b/src/main/java/io/getunleash/Variant.java
@@ -1,9 +1,9 @@
-package no.finn.unleash;
+package io.getunleash;
 
+import io.getunleash.lang.Nullable;
+import io.getunleash.variant.Payload;
 import java.util.Objects;
 import java.util.Optional;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.variant.Payload;
 
 public class Variant {
     public static final Variant DISABLED_VARIANT = new Variant("disabled", (String) null, false);
diff --git a/src/main/java/no/finn/unleash/event/EventDispatcher.java b/src/main/java/io/getunleash/event/EventDispatcher.java
similarity index 83%
rename from src/main/java/no/finn/unleash/event/EventDispatcher.java
rename to src/main/java/io/getunleash/event/EventDispatcher.java
index 2888d450..412c5b3e 100644
--- a/src/main/java/no/finn/unleash/event/EventDispatcher.java
+++ b/src/main/java/io/getunleash/event/EventDispatcher.java
@@ -1,7 +1,7 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.util.UnleashScheduledExecutor;
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.util.UnleashScheduledExecutor;
 
 public class EventDispatcher {
 
diff --git a/src/main/java/no/finn/unleash/event/Log4JSubscriber.java b/src/main/java/io/getunleash/event/Log4JSubscriber.java
similarity index 96%
rename from src/main/java/no/finn/unleash/event/Log4JSubscriber.java
rename to src/main/java/io/getunleash/event/Log4JSubscriber.java
index 21d9ef4e..5009fed4 100644
--- a/src/main/java/no/finn/unleash/event/Log4JSubscriber.java
+++ b/src/main/java/io/getunleash/event/Log4JSubscriber.java
@@ -1,8 +1,8 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
 import static org.slf4j.event.Level.*;
 
-import no.finn.unleash.UnleashException;
+import io.getunleash.UnleashException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.event.Level;
diff --git a/src/main/java/no/finn/unleash/event/NoOpSubscriber.java b/src/main/java/io/getunleash/event/NoOpSubscriber.java
similarity index 66%
rename from src/main/java/no/finn/unleash/event/NoOpSubscriber.java
rename to src/main/java/io/getunleash/event/NoOpSubscriber.java
index 9b2fa77c..2c54665d 100644
--- a/src/main/java/no/finn/unleash/event/NoOpSubscriber.java
+++ b/src/main/java/io/getunleash/event/NoOpSubscriber.java
@@ -1,3 +1,3 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
 public class NoOpSubscriber implements UnleashSubscriber {}
diff --git a/src/main/java/no/finn/unleash/event/ToggleEvaluated.java b/src/main/java/io/getunleash/event/ToggleEvaluated.java
similarity index 95%
rename from src/main/java/no/finn/unleash/event/ToggleEvaluated.java
rename to src/main/java/io/getunleash/event/ToggleEvaluated.java
index 9c54e1f8..a43cbe9b 100644
--- a/src/main/java/no/finn/unleash/event/ToggleEvaluated.java
+++ b/src/main/java/io/getunleash/event/ToggleEvaluated.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
 public class ToggleEvaluated implements UnleashEvent {
 
diff --git a/src/main/java/no/finn/unleash/event/UnleashEvent.java b/src/main/java/io/getunleash/event/UnleashEvent.java
similarity index 75%
rename from src/main/java/no/finn/unleash/event/UnleashEvent.java
rename to src/main/java/io/getunleash/event/UnleashEvent.java
index 7e61423f..ff43a944 100644
--- a/src/main/java/no/finn/unleash/event/UnleashEvent.java
+++ b/src/main/java/io/getunleash/event/UnleashEvent.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
 public interface UnleashEvent {
 
diff --git a/src/main/java/no/finn/unleash/event/UnleashReady.java b/src/main/java/io/getunleash/event/UnleashReady.java
similarity index 85%
rename from src/main/java/no/finn/unleash/event/UnleashReady.java
rename to src/main/java/io/getunleash/event/UnleashReady.java
index f251d2f8..42395fc1 100644
--- a/src/main/java/no/finn/unleash/event/UnleashReady.java
+++ b/src/main/java/io/getunleash/event/UnleashReady.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
 public class UnleashReady implements UnleashEvent {
 
diff --git a/src/main/java/io/getunleash/event/UnleashSubscriber.java b/src/main/java/io/getunleash/event/UnleashSubscriber.java
new file mode 100644
index 00000000..3971fc72
--- /dev/null
+++ b/src/main/java/io/getunleash/event/UnleashSubscriber.java
@@ -0,0 +1,34 @@
+package io.getunleash.event;
+
+import io.getunleash.UnleashException;
+import io.getunleash.metric.ClientMetrics;
+import io.getunleash.metric.ClientRegistration;
+import io.getunleash.repository.FeatureToggleResponse;
+import io.getunleash.repository.ToggleCollection;
+import org.slf4j.LoggerFactory;
+
+public interface UnleashSubscriber {
+
+    default void onError(UnleashException unleashException) {
+        LoggerFactory.getLogger(UnleashSubscriber.class)
+                .warn(unleashException.getMessage(), unleashException);
+    }
+
+    default void on(UnleashEvent unleashEvent) {}
+
+    default void onReady(UnleashReady unleashReady) {}
+
+    default void toggleEvaluated(ToggleEvaluated toggleEvaluated) {}
+
+    default void togglesFetched(FeatureToggleResponse toggleResponse) {}
+
+    default void clientMetrics(ClientMetrics clientMetrics) {}
+
+    default void clientRegistered(ClientRegistration clientRegistration) {}
+
+    default void togglesBackedUp(ToggleCollection toggleCollection) {}
+
+    default void toggleBackupRestored(ToggleCollection toggleCollection) {}
+
+    default void togglesBootstrapped(ToggleCollection toggleCollection) {}
+}
diff --git a/src/main/java/io/getunleash/event/package-info.java b/src/main/java/io/getunleash/event/package-info.java
new file mode 100644
index 00000000..aee30ab2
--- /dev/null
+++ b/src/main/java/io/getunleash/event/package-info.java
@@ -0,0 +1,6 @@
+@NonNullApi
+@NonNullFields
+package io.getunleash.event;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/lang/NonNullApi.java b/src/main/java/io/getunleash/lang/NonNullApi.java
similarity index 91%
rename from src/main/java/no/finn/unleash/lang/NonNullApi.java
rename to src/main/java/io/getunleash/lang/NonNullApi.java
index 2d0d6af5..5dea8d6c 100644
--- a/src/main/java/no/finn/unleash/lang/NonNullApi.java
+++ b/src/main/java/io/getunleash/lang/NonNullApi.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.lang;
+package io.getunleash.lang;
 
 import java.lang.annotation.*;
 import javax.annotation.Nonnull;
diff --git a/src/main/java/no/finn/unleash/lang/NonNullFields.java b/src/main/java/io/getunleash/lang/NonNullFields.java
similarity index 90%
rename from src/main/java/no/finn/unleash/lang/NonNullFields.java
rename to src/main/java/io/getunleash/lang/NonNullFields.java
index 57949b9e..9efa654d 100644
--- a/src/main/java/no/finn/unleash/lang/NonNullFields.java
+++ b/src/main/java/io/getunleash/lang/NonNullFields.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.lang;
+package io.getunleash.lang;
 
 import java.lang.annotation.*;
 import javax.annotation.Nonnull;
diff --git a/src/main/java/no/finn/unleash/lang/Nullable.java b/src/main/java/io/getunleash/lang/Nullable.java
similarity index 92%
rename from src/main/java/no/finn/unleash/lang/Nullable.java
rename to src/main/java/io/getunleash/lang/Nullable.java
index 453d57ee..4812fac3 100644
--- a/src/main/java/no/finn/unleash/lang/Nullable.java
+++ b/src/main/java/io/getunleash/lang/Nullable.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.lang;
+package io.getunleash.lang;
 
 import java.lang.annotation.*;
 import javax.annotation.Nonnull;
diff --git a/src/main/java/no/finn/unleash/metric/ClientMetrics.java b/src/main/java/io/getunleash/metric/ClientMetrics.java
similarity index 85%
rename from src/main/java/no/finn/unleash/metric/ClientMetrics.java
rename to src/main/java/io/getunleash/metric/ClientMetrics.java
index 3e8fcba7..f59a8ecc 100644
--- a/src/main/java/no/finn/unleash/metric/ClientMetrics.java
+++ b/src/main/java/io/getunleash/metric/ClientMetrics.java
@@ -1,8 +1,8 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
-import no.finn.unleash.event.UnleashEvent;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.util.UnleashConfig;
+import io.getunleash.event.UnleashEvent;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.util.UnleashConfig;
 
 public class ClientMetrics implements UnleashEvent {
 
diff --git a/src/main/java/no/finn/unleash/metric/ClientRegistration.java b/src/main/java/io/getunleash/metric/ClientRegistration.java
similarity index 91%
rename from src/main/java/no/finn/unleash/metric/ClientRegistration.java
rename to src/main/java/io/getunleash/metric/ClientRegistration.java
index 13eae3d7..b3019de7 100644
--- a/src/main/java/no/finn/unleash/metric/ClientRegistration.java
+++ b/src/main/java/io/getunleash/metric/ClientRegistration.java
@@ -1,10 +1,10 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
+import io.getunleash.event.UnleashEvent;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.util.UnleashConfig;
 import java.time.LocalDateTime;
 import java.util.Set;
-import no.finn.unleash.event.UnleashEvent;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.util.UnleashConfig;
 
 public class ClientRegistration implements UnleashEvent {
     private final String appName;
diff --git a/src/main/java/no/finn/unleash/metric/MetricsBucket.java b/src/main/java/io/getunleash/metric/MetricsBucket.java
similarity index 94%
rename from src/main/java/no/finn/unleash/metric/MetricsBucket.java
rename to src/main/java/io/getunleash/metric/MetricsBucket.java
index a3083239..be09773f 100644
--- a/src/main/java/no/finn/unleash/metric/MetricsBucket.java
+++ b/src/main/java/io/getunleash/metric/MetricsBucket.java
@@ -1,11 +1,11 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
+import io.getunleash.lang.Nullable;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import no.finn.unleash.lang.Nullable;
 
 class MetricsBucket {
     private final ConcurrentMap<String, ToggleCount> toggles;
diff --git a/src/main/java/no/finn/unleash/metric/ToggleCount.java b/src/main/java/io/getunleash/metric/ToggleCount.java
similarity index 96%
rename from src/main/java/no/finn/unleash/metric/ToggleCount.java
rename to src/main/java/io/getunleash/metric/ToggleCount.java
index b3af7937..8445f026 100644
--- a/src/main/java/no/finn/unleash/metric/ToggleCount.java
+++ b/src/main/java/io/getunleash/metric/ToggleCount.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
diff --git a/src/main/java/io/getunleash/metric/UnleashMetricService.java b/src/main/java/io/getunleash/metric/UnleashMetricService.java
new file mode 100644
index 00000000..1865c3b8
--- /dev/null
+++ b/src/main/java/io/getunleash/metric/UnleashMetricService.java
@@ -0,0 +1,11 @@
+package io.getunleash.metric;
+
+import java.util.Set;
+
+public interface UnleashMetricService {
+    void register(Set<String> strategies);
+
+    void count(String toggleName, boolean active);
+
+    void countVariant(String toggleName, String variantName);
+}
diff --git a/src/main/java/no/finn/unleash/metric/UnleashMetricServiceImpl.java b/src/main/java/io/getunleash/metric/UnleashMetricServiceImpl.java
similarity index 94%
rename from src/main/java/no/finn/unleash/metric/UnleashMetricServiceImpl.java
rename to src/main/java/io/getunleash/metric/UnleashMetricServiceImpl.java
index df4851e8..fa678707 100644
--- a/src/main/java/no/finn/unleash/metric/UnleashMetricServiceImpl.java
+++ b/src/main/java/io/getunleash/metric/UnleashMetricServiceImpl.java
@@ -1,10 +1,10 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.util.UnleashScheduledExecutor;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.Set;
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.util.UnleashScheduledExecutor;
 
 public class UnleashMetricServiceImpl implements UnleashMetricService {
     private final LocalDateTime started;
diff --git a/src/main/java/no/finn/unleash/metric/UnleashMetricsSender.java b/src/main/java/io/getunleash/metric/UnleashMetricsSender.java
similarity index 95%
rename from src/main/java/no/finn/unleash/metric/UnleashMetricsSender.java
rename to src/main/java/io/getunleash/metric/UnleashMetricsSender.java
index ec36266c..e0604750 100644
--- a/src/main/java/no/finn/unleash/metric/UnleashMetricsSender.java
+++ b/src/main/java/io/getunleash/metric/UnleashMetricsSender.java
@@ -1,8 +1,12 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
 import static java.time.format.DateTimeFormatter.ISO_INSTANT;
 
 import com.google.gson.*;
+import io.getunleash.UnleashException;
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.util.UnleashURLs;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.lang.reflect.Type;
@@ -11,10 +15,6 @@ import java.net.URL;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.util.concurrent.atomic.AtomicLong;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.event.EventDispatcher;
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.util.UnleashURLs;
 
 public class UnleashMetricsSender {
     private static final int CONNECT_TIMEOUT = 1000;
diff --git a/src/main/java/io/getunleash/metric/package-info.java b/src/main/java/io/getunleash/metric/package-info.java
new file mode 100644
index 00000000..93f3b625
--- /dev/null
+++ b/src/main/java/io/getunleash/metric/package-info.java
@@ -0,0 +1,6 @@
+@NonNullApi
+@NonNullFields
+package io.getunleash.metric;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/io/getunleash/package-info.java b/src/main/java/io/getunleash/package-info.java
new file mode 100644
index 00000000..14730ee7
--- /dev/null
+++ b/src/main/java/io/getunleash/package-info.java
@@ -0,0 +1,6 @@
+@NonNullApi
+@NonNullFields
+package io.getunleash;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/repository/FeatureToggleRepository.java b/src/main/java/io/getunleash/repository/FeatureToggleRepository.java
similarity index 88%
rename from src/main/java/no/finn/unleash/repository/FeatureToggleRepository.java
rename to src/main/java/io/getunleash/repository/FeatureToggleRepository.java
index a73f6e31..f103e16f 100644
--- a/src/main/java/no/finn/unleash/repository/FeatureToggleRepository.java
+++ b/src/main/java/io/getunleash/repository/FeatureToggleRepository.java
@@ -1,14 +1,14 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
+import io.getunleash.FeatureToggle;
+import io.getunleash.UnleashException;
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.event.UnleashReady;
+import io.getunleash.lang.Nullable;
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.util.UnleashScheduledExecutor;
 import java.util.List;
 import java.util.stream.Collectors;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.event.EventDispatcher;
-import no.finn.unleash.event.UnleashReady;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.util.UnleashScheduledExecutor;
 
 public final class FeatureToggleRepository implements ToggleRepository {
     private final ToggleBackupHandler toggleBackupHandler;
diff --git a/src/main/java/no/finn/unleash/repository/FeatureToggleResponse.java b/src/main/java/io/getunleash/repository/FeatureToggleResponse.java
similarity index 89%
rename from src/main/java/no/finn/unleash/repository/FeatureToggleResponse.java
rename to src/main/java/io/getunleash/repository/FeatureToggleResponse.java
index 6dbaf793..a1e08240 100644
--- a/src/main/java/no/finn/unleash/repository/FeatureToggleResponse.java
+++ b/src/main/java/io/getunleash/repository/FeatureToggleResponse.java
@@ -1,12 +1,12 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
+import io.getunleash.FeatureToggle;
+import io.getunleash.UnleashException;
+import io.getunleash.event.UnleashEvent;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.lang.Nullable;
 import java.util.Collections;
 import java.util.List;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.event.UnleashEvent;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.lang.Nullable;
 
 public final class FeatureToggleResponse implements UnleashEvent {
 
diff --git a/src/main/java/no/finn/unleash/repository/HttpToggleFetcher.java b/src/main/java/io/getunleash/repository/HttpToggleFetcher.java
similarity index 97%
rename from src/main/java/no/finn/unleash/repository/HttpToggleFetcher.java
rename to src/main/java/io/getunleash/repository/HttpToggleFetcher.java
index f7173615..636576a9 100644
--- a/src/main/java/no/finn/unleash/repository/HttpToggleFetcher.java
+++ b/src/main/java/io/getunleash/repository/HttpToggleFetcher.java
@@ -1,5 +1,7 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
+import io.getunleash.UnleashException;
+import io.getunleash.util.UnleashConfig;
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -8,8 +10,6 @@ import java.net.HttpURLConnection;
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.Optional;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.util.UnleashConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/main/java/no/finn/unleash/repository/JsonToggleCollectionDeserializer.java b/src/main/java/io/getunleash/repository/JsonToggleCollectionDeserializer.java
similarity index 95%
rename from src/main/java/no/finn/unleash/repository/JsonToggleCollectionDeserializer.java
rename to src/main/java/io/getunleash/repository/JsonToggleCollectionDeserializer.java
index e49401e5..82e6a2f1 100644
--- a/src/main/java/no/finn/unleash/repository/JsonToggleCollectionDeserializer.java
+++ b/src/main/java/io/getunleash/repository/JsonToggleCollectionDeserializer.java
@@ -1,15 +1,15 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static java.util.Collections.emptyList;
 import static java.util.Collections.singletonList;
 
 import com.google.gson.*;
 import com.google.gson.reflect.TypeToken;
+import io.getunleash.ActivationStrategy;
+import io.getunleash.FeatureToggle;
+import io.getunleash.lang.Nullable;
 import java.lang.reflect.Type;
 import java.util.*;
-import no.finn.unleash.ActivationStrategy;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.lang.Nullable;
 
 public class JsonToggleCollectionDeserializer implements JsonDeserializer<ToggleCollection> {
     private static final Type PARAMS_TYPE = new TypeToken<Map<String, String>>() {}.getType();
diff --git a/src/main/java/no/finn/unleash/repository/JsonToggleParser.java b/src/main/java/io/getunleash/repository/JsonToggleParser.java
similarity index 96%
rename from src/main/java/no/finn/unleash/repository/JsonToggleParser.java
rename to src/main/java/io/getunleash/repository/JsonToggleParser.java
index 1d2fbe40..636e5dd5 100644
--- a/src/main/java/no/finn/unleash/repository/JsonToggleParser.java
+++ b/src/main/java/io/getunleash/repository/JsonToggleParser.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
diff --git a/src/main/java/no/finn/unleash/repository/ToggleBackupHandler.java b/src/main/java/io/getunleash/repository/ToggleBackupHandler.java
similarity index 77%
rename from src/main/java/no/finn/unleash/repository/ToggleBackupHandler.java
rename to src/main/java/io/getunleash/repository/ToggleBackupHandler.java
index f4fd2a81..1ce9f471 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleBackupHandler.java
+++ b/src/main/java/io/getunleash/repository/ToggleBackupHandler.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 public interface ToggleBackupHandler {
     ToggleCollection read();
diff --git a/src/main/java/no/finn/unleash/repository/ToggleBackupHandlerFile.java b/src/main/java/io/getunleash/repository/ToggleBackupHandlerFile.java
similarity index 91%
rename from src/main/java/no/finn/unleash/repository/ToggleBackupHandlerFile.java
rename to src/main/java/io/getunleash/repository/ToggleBackupHandlerFile.java
index e1be9c8f..da62f652 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleBackupHandlerFile.java
+++ b/src/main/java/io/getunleash/repository/ToggleBackupHandlerFile.java
@@ -1,15 +1,15 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import com.google.gson.JsonParseException;
+import io.getunleash.FeatureToggle;
+import io.getunleash.UnleashException;
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.event.UnleashEvent;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.util.UnleashConfig;
 import java.io.*;
 import java.util.Collections;
 import java.util.List;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.event.EventDispatcher;
-import no.finn.unleash.event.UnleashEvent;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.util.UnleashConfig;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/main/java/no/finn/unleash/repository/ToggleBootstrapFileProvider.java b/src/main/java/io/getunleash/repository/ToggleBootstrapFileProvider.java
similarity index 97%
rename from src/main/java/no/finn/unleash/repository/ToggleBootstrapFileProvider.java
rename to src/main/java/io/getunleash/repository/ToggleBootstrapFileProvider.java
index b27915cf..d61d64d3 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleBootstrapFileProvider.java
+++ b/src/main/java/io/getunleash/repository/ToggleBootstrapFileProvider.java
@@ -1,5 +1,6 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
+import io.getunleash.lang.Nullable;
 import java.io.File;
 import java.io.FileNotFoundException;
 import java.io.IOException;
@@ -8,7 +9,6 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import no.finn.unleash.lang.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/main/java/no/finn/unleash/repository/ToggleBootstrapHandler.java b/src/main/java/io/getunleash/repository/ToggleBootstrapHandler.java
similarity index 86%
rename from src/main/java/no/finn/unleash/repository/ToggleBootstrapHandler.java
rename to src/main/java/io/getunleash/repository/ToggleBootstrapHandler.java
index 78464be1..57738d6b 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleBootstrapHandler.java
+++ b/src/main/java/io/getunleash/repository/ToggleBootstrapHandler.java
@@ -1,13 +1,13 @@
-package no.finn.unleash.repository;
-
+package io.getunleash.repository;
+
+import io.getunleash.UnleashException;
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.event.UnleashEvent;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.lang.Nullable;
+import io.getunleash.util.UnleashConfig;
 import java.io.StringReader;
 import java.util.Collections;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.event.EventDispatcher;
-import no.finn.unleash.event.UnleashEvent;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.util.UnleashConfig;
 
 public class ToggleBootstrapHandler {
     private final EventDispatcher eventDispatcher;
diff --git a/src/main/java/no/finn/unleash/repository/ToggleBootstrapProvider.java b/src/main/java/io/getunleash/repository/ToggleBootstrapProvider.java
similarity index 51%
rename from src/main/java/no/finn/unleash/repository/ToggleBootstrapProvider.java
rename to src/main/java/io/getunleash/repository/ToggleBootstrapProvider.java
index eeb3c7e2..9eee1609 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleBootstrapProvider.java
+++ b/src/main/java/io/getunleash/repository/ToggleBootstrapProvider.java
@@ -1,13 +1,12 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 public interface ToggleBootstrapProvider {
     /**
      * Should return JSON string parsable to /api/client/features format Look in
      * src/test/resources/features-v1.json or src/test/resources/unleash-repo-v1.json for example
-     * Example in {@link no.finn.unleash.repository.ToggleBootstrapFileProvider}
+     * Example in {@link ToggleBootstrapFileProvider}
      *
-     * @return JSON string that can be sent to {@link
-     *     no.finn.unleash.repository.ToggleBootstrapHandler#parse(String)}
+     * @return JSON string that can be sent to {@link ToggleBootstrapHandler#parse(String)}
      */
     String read();
 }
diff --git a/src/main/java/no/finn/unleash/repository/ToggleCollection.java b/src/main/java/io/getunleash/repository/ToggleCollection.java
similarity index 90%
rename from src/main/java/no/finn/unleash/repository/ToggleCollection.java
rename to src/main/java/io/getunleash/repository/ToggleCollection.java
index a6d43542..1a01f1ab 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleCollection.java
+++ b/src/main/java/io/getunleash/repository/ToggleCollection.java
@@ -1,11 +1,11 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
+import io.getunleash.FeatureToggle;
+import io.getunleash.lang.Nullable;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.lang.Nullable;
 
 public final class ToggleCollection {
     private final Collection<FeatureToggle> features;
diff --git a/src/main/java/no/finn/unleash/repository/ToggleFetcher.java b/src/main/java/io/getunleash/repository/ToggleFetcher.java
similarity index 57%
rename from src/main/java/no/finn/unleash/repository/ToggleFetcher.java
rename to src/main/java/io/getunleash/repository/ToggleFetcher.java
index 659d897e..f50c8299 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleFetcher.java
+++ b/src/main/java/io/getunleash/repository/ToggleFetcher.java
@@ -1,6 +1,6 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
-import no.finn.unleash.UnleashException;
+import io.getunleash.UnleashException;
 
 public interface ToggleFetcher {
     FeatureToggleResponse fetchToggles() throws UnleashException;
diff --git a/src/main/java/no/finn/unleash/repository/ToggleRepository.java b/src/main/java/io/getunleash/repository/ToggleRepository.java
similarity index 58%
rename from src/main/java/no/finn/unleash/repository/ToggleRepository.java
rename to src/main/java/io/getunleash/repository/ToggleRepository.java
index 3ac76c91..49ff1668 100644
--- a/src/main/java/no/finn/unleash/repository/ToggleRepository.java
+++ b/src/main/java/io/getunleash/repository/ToggleRepository.java
@@ -1,8 +1,8 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
+import io.getunleash.FeatureToggle;
+import io.getunleash.lang.Nullable;
 import java.util.List;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.lang.Nullable;
 
 public interface ToggleRepository {
     @Nullable
diff --git a/src/main/java/io/getunleash/repository/package-info.java b/src/main/java/io/getunleash/repository/package-info.java
new file mode 100644
index 00000000..311b4595
--- /dev/null
+++ b/src/main/java/io/getunleash/repository/package-info.java
@@ -0,0 +1,6 @@
+@NonNullApi
+@NonNullFields
+package io.getunleash.repository;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/strategy/ApplicationHostnameStrategy.java b/src/main/java/io/getunleash/strategy/ApplicationHostnameStrategy.java
similarity index 97%
rename from src/main/java/no/finn/unleash/strategy/ApplicationHostnameStrategy.java
rename to src/main/java/io/getunleash/strategy/ApplicationHostnameStrategy.java
index 2d3c5bcc..dbd0769a 100644
--- a/src/main/java/no/finn/unleash/strategy/ApplicationHostnameStrategy.java
+++ b/src/main/java/io/getunleash/strategy/ApplicationHostnameStrategy.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
diff --git a/src/main/java/no/finn/unleash/strategy/ConstraintUtil.java b/src/main/java/io/getunleash/strategy/ConstraintUtil.java
similarity index 81%
rename from src/main/java/no/finn/unleash/strategy/ConstraintUtil.java
rename to src/main/java/io/getunleash/strategy/ConstraintUtil.java
index c5223a32..9eabc063 100644
--- a/src/main/java/no/finn/unleash/strategy/ConstraintUtil.java
+++ b/src/main/java/io/getunleash/strategy/ConstraintUtil.java
@@ -1,11 +1,11 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
+import io.getunleash.Constraint;
+import io.getunleash.Operator;
+import io.getunleash.UnleashContext;
+import io.getunleash.lang.Nullable;
 import java.util.List;
 import java.util.Optional;
-import no.finn.unleash.Constraint;
-import no.finn.unleash.Operator;
-import no.finn.unleash.UnleashContext;
-import no.finn.unleash.lang.Nullable;
 
 public class ConstraintUtil {
 
diff --git a/src/main/java/no/finn/unleash/strategy/DefaultStrategy.java b/src/main/java/io/getunleash/strategy/DefaultStrategy.java
similarity index 90%
rename from src/main/java/no/finn/unleash/strategy/DefaultStrategy.java
rename to src/main/java/io/getunleash/strategy/DefaultStrategy.java
index 7ebc3cd0..81e0f6b1 100644
--- a/src/main/java/no/finn/unleash/strategy/DefaultStrategy.java
+++ b/src/main/java/io/getunleash/strategy/DefaultStrategy.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import java.util.Map;
 
diff --git a/src/main/java/no/finn/unleash/strategy/FlexibleRolloutStrategy.java b/src/main/java/io/getunleash/strategy/FlexibleRolloutStrategy.java
similarity index 96%
rename from src/main/java/no/finn/unleash/strategy/FlexibleRolloutStrategy.java
rename to src/main/java/io/getunleash/strategy/FlexibleRolloutStrategy.java
index 0c586772..a8b12e98 100644
--- a/src/main/java/no/finn/unleash/strategy/FlexibleRolloutStrategy.java
+++ b/src/main/java/io/getunleash/strategy/FlexibleRolloutStrategy.java
@@ -1,9 +1,9 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
+import io.getunleash.UnleashContext;
 import java.util.Map;
 import java.util.Optional;
 import java.util.function.Supplier;
-import no.finn.unleash.UnleashContext;
 
 public class FlexibleRolloutStrategy implements Strategy {
     protected static final String PERCENTAGE = "rollout";
diff --git a/src/main/java/no/finn/unleash/strategy/GradualRolloutRandomStrategy.java b/src/main/java/io/getunleash/strategy/GradualRolloutRandomStrategy.java
similarity index 96%
rename from src/main/java/no/finn/unleash/strategy/GradualRolloutRandomStrategy.java
rename to src/main/java/io/getunleash/strategy/GradualRolloutRandomStrategy.java
index 003e0e6b..2e448d3c 100644
--- a/src/main/java/no/finn/unleash/strategy/GradualRolloutRandomStrategy.java
+++ b/src/main/java/io/getunleash/strategy/GradualRolloutRandomStrategy.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import java.util.Map;
 import java.util.Random;
diff --git a/src/main/java/no/finn/unleash/strategy/GradualRolloutSessionIdStrategy.java b/src/main/java/io/getunleash/strategy/GradualRolloutSessionIdStrategy.java
similarity index 95%
rename from src/main/java/no/finn/unleash/strategy/GradualRolloutSessionIdStrategy.java
rename to src/main/java/io/getunleash/strategy/GradualRolloutSessionIdStrategy.java
index 39c7c05e..f0e454ed 100644
--- a/src/main/java/no/finn/unleash/strategy/GradualRolloutSessionIdStrategy.java
+++ b/src/main/java/io/getunleash/strategy/GradualRolloutSessionIdStrategy.java
@@ -1,8 +1,8 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
+import io.getunleash.UnleashContext;
 import java.util.Map;
 import java.util.Optional;
-import no.finn.unleash.UnleashContext;
 
 /**
  * Implements a gradual roll-out strategy based on session id.
diff --git a/src/main/java/no/finn/unleash/strategy/GradualRolloutUserIdStrategy.java b/src/main/java/io/getunleash/strategy/GradualRolloutUserIdStrategy.java
similarity index 95%
rename from src/main/java/no/finn/unleash/strategy/GradualRolloutUserIdStrategy.java
rename to src/main/java/io/getunleash/strategy/GradualRolloutUserIdStrategy.java
index d6068df2..bab24681 100644
--- a/src/main/java/no/finn/unleash/strategy/GradualRolloutUserIdStrategy.java
+++ b/src/main/java/io/getunleash/strategy/GradualRolloutUserIdStrategy.java
@@ -1,8 +1,8 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
+import io.getunleash.UnleashContext;
 import java.util.Map;
 import java.util.Optional;
-import no.finn.unleash.UnleashContext;
 
 /**
  * Implements a gradual roll-out strategy based on userId.
diff --git a/src/main/java/no/finn/unleash/strategy/RemoteAddressStrategy.java b/src/main/java/io/getunleash/strategy/RemoteAddressStrategy.java
similarity index 94%
rename from src/main/java/no/finn/unleash/strategy/RemoteAddressStrategy.java
rename to src/main/java/io/getunleash/strategy/RemoteAddressStrategy.java
index 403fc79a..05edd33f 100644
--- a/src/main/java/no/finn/unleash/strategy/RemoteAddressStrategy.java
+++ b/src/main/java/io/getunleash/strategy/RemoteAddressStrategy.java
@@ -1,12 +1,12 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
+import io.getunleash.UnleashContext;
+import io.getunleash.util.IpAddressMatcher;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
-import no.finn.unleash.UnleashContext;
-import no.finn.unleash.util.IpAddressMatcher;
 
 public final class RemoteAddressStrategy implements Strategy {
     static final String PARAM = "IPs";
diff --git a/src/main/java/no/finn/unleash/strategy/Strategy.java b/src/main/java/io/getunleash/strategy/Strategy.java
similarity index 84%
rename from src/main/java/no/finn/unleash/strategy/Strategy.java
rename to src/main/java/io/getunleash/strategy/Strategy.java
index 31acdcc7..1720f694 100644
--- a/src/main/java/no/finn/unleash/strategy/Strategy.java
+++ b/src/main/java/io/getunleash/strategy/Strategy.java
@@ -1,9 +1,9 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
+import io.getunleash.Constraint;
+import io.getunleash.UnleashContext;
 import java.util.List;
 import java.util.Map;
-import no.finn.unleash.Constraint;
-import no.finn.unleash.UnleashContext;
 
 public interface Strategy {
     String getName();
diff --git a/src/main/java/no/finn/unleash/strategy/StrategyUtils.java b/src/main/java/io/getunleash/strategy/StrategyUtils.java
similarity index 96%
rename from src/main/java/no/finn/unleash/strategy/StrategyUtils.java
rename to src/main/java/io/getunleash/strategy/StrategyUtils.java
index 787865e6..bc9fbdc2 100644
--- a/src/main/java/no/finn/unleash/strategy/StrategyUtils.java
+++ b/src/main/java/io/getunleash/strategy/StrategyUtils.java
@@ -1,7 +1,7 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import com.sangupta.murmur.Murmur3;
-import no.finn.unleash.lang.Nullable;
+import io.getunleash.lang.Nullable;
 
 public final class StrategyUtils {
     private static final int ONE_HUNDRED = 100;
diff --git a/src/main/java/no/finn/unleash/strategy/UnknownStrategy.java b/src/main/java/io/getunleash/strategy/UnknownStrategy.java
similarity index 90%
rename from src/main/java/no/finn/unleash/strategy/UnknownStrategy.java
rename to src/main/java/io/getunleash/strategy/UnknownStrategy.java
index 0ae2fe29..326fb4f7 100644
--- a/src/main/java/no/finn/unleash/strategy/UnknownStrategy.java
+++ b/src/main/java/io/getunleash/strategy/UnknownStrategy.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import java.util.Map;
 
diff --git a/src/main/java/no/finn/unleash/strategy/UserWithIdStrategy.java b/src/main/java/io/getunleash/strategy/UserWithIdStrategy.java
similarity index 93%
rename from src/main/java/no/finn/unleash/strategy/UserWithIdStrategy.java
rename to src/main/java/io/getunleash/strategy/UserWithIdStrategy.java
index 78a832a6..6fbe0bf2 100644
--- a/src/main/java/no/finn/unleash/strategy/UserWithIdStrategy.java
+++ b/src/main/java/io/getunleash/strategy/UserWithIdStrategy.java
@@ -1,10 +1,10 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static java.util.Arrays.asList;
 
+import io.getunleash.UnleashContext;
 import java.util.Map;
 import java.util.Optional;
-import no.finn.unleash.UnleashContext;
 
 public final class UserWithIdStrategy implements Strategy {
 
diff --git a/src/main/java/io/getunleash/strategy/package-info.java b/src/main/java/io/getunleash/strategy/package-info.java
new file mode 100644
index 00000000..2d4843f2
--- /dev/null
+++ b/src/main/java/io/getunleash/strategy/package-info.java
@@ -0,0 +1,6 @@
+@NonNullFields
+@NonNullApi
+package io.getunleash.strategy;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/util/IpAddressMatcher.java b/src/main/java/io/getunleash/util/IpAddressMatcher.java
similarity index 98%
rename from src/main/java/no/finn/unleash/util/IpAddressMatcher.java
rename to src/main/java/io/getunleash/util/IpAddressMatcher.java
index a068341b..65f2c0c7 100644
--- a/src/main/java/no/finn/unleash/util/IpAddressMatcher.java
+++ b/src/main/java/io/getunleash/util/IpAddressMatcher.java
@@ -13,13 +13,13 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package no.finn.unleash.util;
+package io.getunleash.util;
 
+import io.getunleash.lang.Nullable;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.Arrays;
 import java.util.regex.Pattern;
-import no.finn.unleash.lang.Nullable;
 
 /**
  * Matches a request based on IP Address or subnet mask matching against the remote address.
diff --git a/src/main/java/io/getunleash/util/UnleashConfig.java b/src/main/java/io/getunleash/util/UnleashConfig.java
new file mode 100644
index 00000000..df0bba0f
--- /dev/null
+++ b/src/main/java/io/getunleash/util/UnleashConfig.java
@@ -0,0 +1,491 @@
+package io.getunleash.util;
+
+import static io.getunleash.DefaultUnleash.UNKNOWN_STRATEGY;
+
+import io.getunleash.CustomHttpHeadersProvider;
+import io.getunleash.DefaultCustomHttpHeadersProviderImpl;
+import io.getunleash.UnleashContextProvider;
+import io.getunleash.event.NoOpSubscriber;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.lang.Nullable;
+import io.getunleash.repository.ToggleBootstrapProvider;
+import io.getunleash.strategy.Strategy;
+import java.io.File;
+import java.net.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+public class UnleashConfig {
+
+    static final String UNLEASH_APP_NAME_HEADER = "UNLEASH-APPNAME";
+    static final String UNLEASH_INSTANCE_ID_HEADER = "UNLEASH-INSTANCEID";
+
+    private final URI unleashAPI;
+    private final UnleashURLs unleashURLs;
+    private final Map<String, String> customHttpHeaders;
+    private final CustomHttpHeadersProvider customHttpHeadersProvider;
+    private final String appName;
+    private final String environment;
+    private final String instanceId;
+    private final String sdkVersion;
+    private final String backupFile;
+    @Nullable private final String projectName;
+    @Nullable private final String namePrefix;
+    private final long fetchTogglesInterval;
+    private final long sendMetricsInterval;
+    private final boolean disableMetrics;
+    private final boolean isProxyAuthenticationByJvmProperties;
+    private final UnleashContextProvider contextProvider;
+    private final boolean synchronousFetchOnInitialisation;
+    private final UnleashScheduledExecutor unleashScheduledExecutor;
+    private final UnleashSubscriber unleashSubscriber;
+    @Nullable private final Strategy fallbackStrategy;
+    @Nullable private final ToggleBootstrapProvider toggleBootstrapProvider;
+    @Nullable private final Proxy proxy;
+
+    private UnleashConfig(
+            @Nullable URI unleashAPI,
+            Map<String, String> customHttpHeaders,
+            CustomHttpHeadersProvider customHttpHeadersProvider,
+            @Nullable String appName,
+            String environment,
+            @Nullable String instanceId,
+            String sdkVersion,
+            String backupFile,
+            @Nullable String projectName,
+            @Nullable String namePrefix,
+            long fetchTogglesInterval,
+            long sendMetricsInterval,
+            boolean disableMetrics,
+            UnleashContextProvider contextProvider,
+            boolean isProxyAuthenticationByJvmProperties,
+            boolean synchronousFetchOnInitialisation,
+            @Nullable UnleashScheduledExecutor unleashScheduledExecutor,
+            @Nullable UnleashSubscriber unleashSubscriber,
+            @Nullable Strategy fallbackStrategy,
+            @Nullable ToggleBootstrapProvider unleashBootstrapProvider,
+            @Nullable Proxy proxy,
+            @Nullable Authenticator proxyAuthenticator) {
+
+        if (appName == null) {
+            throw new IllegalStateException("You are required to specify the unleash appName");
+        }
+
+        if (instanceId == null) {
+            throw new IllegalStateException("You are required to specify the unleash instanceId");
+        }
+
+        if (unleashAPI == null) {
+            throw new IllegalStateException("You are required to specify the unleashAPI url");
+        }
+
+        if (unleashScheduledExecutor == null) {
+            throw new IllegalStateException("You are required to specify a scheduler");
+        }
+
+        if (unleashSubscriber == null) {
+            throw new IllegalStateException("You are required to specify a subscriber");
+        }
+
+        if (fallbackStrategy == null) {
+            this.fallbackStrategy = UNKNOWN_STRATEGY;
+        } else {
+            this.fallbackStrategy = fallbackStrategy;
+        }
+
+        if (isProxyAuthenticationByJvmProperties && proxyAuthenticator == null) {
+            enableProxyAuthentication();
+        } else if (proxyAuthenticator != null) {
+            Authenticator.setDefault(proxyAuthenticator);
+        }
+
+        this.unleashAPI = unleashAPI;
+        this.customHttpHeaders = customHttpHeaders;
+        this.customHttpHeadersProvider = customHttpHeadersProvider;
+        this.unleashURLs = new UnleashURLs(unleashAPI);
+        this.appName = appName;
+        this.environment = environment;
+        this.instanceId = instanceId;
+        this.sdkVersion = sdkVersion;
+        this.backupFile = backupFile;
+        this.projectName = projectName;
+        this.namePrefix = namePrefix;
+        this.fetchTogglesInterval = fetchTogglesInterval;
+        this.sendMetricsInterval = sendMetricsInterval;
+        this.disableMetrics = disableMetrics;
+        this.contextProvider = contextProvider;
+        this.isProxyAuthenticationByJvmProperties = isProxyAuthenticationByJvmProperties;
+        this.synchronousFetchOnInitialisation = synchronousFetchOnInitialisation;
+        this.unleashScheduledExecutor = unleashScheduledExecutor;
+        this.unleashSubscriber = unleashSubscriber;
+        this.toggleBootstrapProvider = unleashBootstrapProvider;
+        this.proxy = proxy;
+    }
+
+    public static Builder builder() {
+        return new Builder();
+    }
+
+    public static void setRequestProperties(HttpURLConnection connection, UnleashConfig config) {
+        connection.setRequestProperty(UNLEASH_APP_NAME_HEADER, config.getAppName());
+        connection.setRequestProperty(UNLEASH_INSTANCE_ID_HEADER, config.getInstanceId());
+        connection.setRequestProperty("User-Agent", config.getAppName());
+        config.getCustomHttpHeaders().forEach(connection::setRequestProperty);
+        config.customHttpHeadersProvider.getCustomHeaders().forEach(connection::setRequestProperty);
+    }
+
+    private void enableProxyAuthentication() {
+        // http.proxyUser http.proxyPassword is only consumed by Apache HTTP Client, for
+        // HttpUrlConnection we have to define an Authenticator
+        Authenticator.setDefault(new SystemProxyAuthenticator());
+    }
+
+    public URI getUnleashAPI() {
+        return unleashAPI;
+    }
+
+    public Map<String, String> getCustomHttpHeaders() {
+        return customHttpHeaders;
+    }
+
+    public CustomHttpHeadersProvider getCustomHttpHeadersProvider() {
+        return customHttpHeadersProvider;
+    }
+
+    public String getAppName() {
+        return appName;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
+
+    public String getInstanceId() {
+        return instanceId;
+    }
+
+    public String getSdkVersion() {
+        return sdkVersion;
+    }
+
+    public @Nullable String getProjectName() {
+        return projectName;
+    }
+
+    public long getFetchTogglesInterval() {
+        return fetchTogglesInterval;
+    }
+
+    public long getSendMetricsInterval() {
+        return sendMetricsInterval;
+    }
+
+    public UnleashURLs getUnleashURLs() {
+        return unleashURLs;
+    }
+
+    public boolean isDisableMetrics() {
+        return disableMetrics;
+    }
+
+    public String getBackupFile() {
+        return this.backupFile;
+    }
+
+    public boolean isSynchronousFetchOnInitialisation() {
+        return synchronousFetchOnInitialisation;
+    }
+
+    public UnleashContextProvider getContextProvider() {
+        return contextProvider;
+    }
+
+    public UnleashScheduledExecutor getScheduledExecutor() {
+        return unleashScheduledExecutor;
+    }
+
+    public UnleashSubscriber getSubscriber() {
+        return unleashSubscriber;
+    }
+
+    public boolean isProxyAuthenticationByJvmProperties() {
+        return isProxyAuthenticationByJvmProperties;
+    }
+
+    @Nullable
+    public Strategy getFallbackStrategy() {
+        return fallbackStrategy;
+    }
+
+    @Nullable
+    public ToggleBootstrapProvider getToggleBootstrapProvider() {
+        return toggleBootstrapProvider;
+    }
+
+    @Nullable
+    public String getNamePrefix() {
+        return namePrefix;
+    }
+
+    @Nullable
+    public Proxy getProxy() {
+        return proxy;
+    }
+
+    static class SystemProxyAuthenticator extends Authenticator {
+        @Override
+        protected @Nullable PasswordAuthentication getPasswordAuthentication() {
+            if (getRequestorType() == RequestorType.PROXY) {
+                final String proto = getRequestingProtocol().toLowerCase();
+                final String proxyHost = System.getProperty(proto + ".proxyHost", "");
+                final String proxyPort = System.getProperty(proto + ".proxyPort", "");
+                final String proxyUser = System.getProperty(proto + ".proxyUser", "");
+                final String proxyPassword = System.getProperty(proto + ".proxyPassword", "");
+
+                // Only apply PasswordAuthentication to requests to the proxy itself - if not set
+                // just ignore
+                if (getRequestingHost().equalsIgnoreCase(proxyHost)
+                        && Integer.parseInt(proxyPort) == getRequestingPort()) {
+                    return new PasswordAuthentication(proxyUser, proxyPassword.toCharArray());
+                }
+            }
+            return null;
+        }
+    }
+
+    static class CustomProxyAuthenticator extends Authenticator {
+
+        private final Proxy proxy;
+        private final String proxyUser;
+        private final String proxyPassword;
+
+        public CustomProxyAuthenticator(Proxy proxy, String proxyUser, String proxyPassword) {
+            this.proxy = proxy;
+            this.proxyUser = proxyUser;
+            this.proxyPassword = proxyPassword;
+        }
+
+        @Override
+        protected @Nullable PasswordAuthentication getPasswordAuthentication() {
+            if (getRequestorType() == RequestorType.PROXY
+                    && proxy.type() == Proxy.Type.HTTP
+                    && proxy.address() instanceof InetSocketAddress) {
+                final String proxyHost = ((InetSocketAddress) proxy.address()).getHostName();
+                final int proxyPort = ((InetSocketAddress) proxy.address()).getPort();
+
+                // Only apply PasswordAuthentication to requests to the proxy
+                // itself - if not set
+                // just ignore
+                if (getRequestingHost().equalsIgnoreCase(proxyHost)
+                        && proxyPort == getRequestingPort()) {
+                    return new PasswordAuthentication(proxyUser, proxyPassword.toCharArray());
+                }
+            }
+            return null;
+        }
+    }
+
+    public static class Builder {
+
+        private @Nullable URI unleashAPI;
+        private Map<String, String> customHttpHeaders = new HashMap<>();
+        private CustomHttpHeadersProvider customHttpHeadersProvider =
+                new DefaultCustomHttpHeadersProviderImpl();
+        private @Nullable String appName;
+        private String environment = "default";
+        private String instanceId = getDefaultInstanceId();
+        private final String sdkVersion = getDefaultSdkVersion();
+        private @Nullable String backupFile;
+        private @Nullable String projectName;
+        private @Nullable String namePrefix;
+        private long fetchTogglesInterval = 10;
+        private long sendMetricsInterval = 60;
+        private boolean disableMetrics = false;
+        private UnleashContextProvider contextProvider =
+                UnleashContextProvider.getDefaultProvider();
+        private boolean synchronousFetchOnInitialisation = false;
+        private @Nullable UnleashScheduledExecutor scheduledExecutor;
+        private @Nullable UnleashSubscriber unleashSubscriber;
+        private boolean isProxyAuthenticationByJvmProperties;
+        private @Nullable Strategy fallbackStrategy;
+        private @Nullable ToggleBootstrapProvider toggleBootstrapProvider;
+        private @Nullable Proxy proxy;
+        private @Nullable Authenticator proxyAuthenticator;
+
+        private static String getHostname() {
+            String hostName = System.getProperty("hostname");
+            if (hostName == null || hostName.length() == 0) {
+                try {
+                    hostName = InetAddress.getLocalHost().getHostName();
+                } catch (UnknownHostException e) {
+                }
+            }
+            return hostName + "-";
+        }
+
+        static String getDefaultInstanceId() {
+            return getHostname() + "generated-" + Math.round(Math.random() * 1000000.0D);
+        }
+
+        public Builder unleashAPI(URI unleashAPI) {
+            this.unleashAPI = unleashAPI;
+            return this;
+        }
+
+        public Builder unleashAPI(String unleashAPI) {
+            this.unleashAPI = URI.create(unleashAPI);
+            return this;
+        }
+
+        public Builder customHttpHeader(String name, String value) {
+            this.customHttpHeaders.put(name, value);
+            return this;
+        }
+
+        public Builder customHttpHeadersProvider(CustomHttpHeadersProvider provider) {
+            this.customHttpHeadersProvider = provider;
+            return this;
+        }
+
+        public Builder appName(String appName) {
+            this.appName = appName;
+            return this;
+        }
+
+        public Builder environment(String environment) {
+            this.environment = environment;
+            return this;
+        }
+
+        public Builder instanceId(String instanceId) {
+            this.instanceId = instanceId;
+            return this;
+        }
+
+        public Builder projectName(String projectName) {
+            this.projectName = projectName;
+            return this;
+        }
+
+        public Builder namePrefix(String namePrefix) {
+            this.namePrefix = namePrefix;
+            return this;
+        }
+
+        public Builder fetchTogglesInterval(long fetchTogglesInterval) {
+            this.fetchTogglesInterval = fetchTogglesInterval;
+            return this;
+        }
+
+        public Builder sendMetricsInterval(long sendMetricsInterval) {
+            this.sendMetricsInterval = sendMetricsInterval;
+            return this;
+        }
+
+        public Builder disableMetrics() {
+            this.disableMetrics = true;
+            return this;
+        }
+
+        public Builder backupFile(String backupFile) {
+            this.backupFile = backupFile;
+            return this;
+        }
+
+        public Builder enableProxyAuthenticationByJvmProperties() {
+            this.isProxyAuthenticationByJvmProperties = true;
+            return this;
+        }
+
+        public Builder unleashContextProvider(UnleashContextProvider contextProvider) {
+            this.contextProvider = contextProvider;
+            return this;
+        }
+
+        public Builder synchronousFetchOnInitialisation(boolean enable) {
+            this.synchronousFetchOnInitialisation = enable;
+            return this;
+        }
+
+        public Builder scheduledExecutor(UnleashScheduledExecutor scheduledExecutor) {
+            this.scheduledExecutor = scheduledExecutor;
+            return this;
+        }
+
+        public Builder subscriber(UnleashSubscriber unleashSubscriber) {
+            this.unleashSubscriber = unleashSubscriber;
+            return this;
+        }
+
+        public Builder fallbackStrategy(@Nullable Strategy fallbackStrategy) {
+            this.fallbackStrategy = fallbackStrategy;
+            return this;
+        }
+
+        public Builder toggleBootstrapProvider(
+                @Nullable ToggleBootstrapProvider toggleBootstrapProvider) {
+            this.toggleBootstrapProvider = toggleBootstrapProvider;
+            return this;
+        }
+
+        public Builder proxy(Proxy proxy) {
+            this.proxy = proxy;
+            return this;
+        }
+
+        public Builder proxy(
+                Proxy proxy, @Nullable String proxyUser, @Nullable String proxyPassword) {
+            this.proxy = proxy;
+
+            if (proxyUser != null && proxyPassword != null) {
+                this.proxyAuthenticator =
+                        new CustomProxyAuthenticator(proxy, proxyUser, proxyPassword);
+            }
+            return this;
+        }
+
+        private String getBackupFile() {
+            if (backupFile != null) {
+                return backupFile;
+            } else {
+                String fileName = "unleash-" + appName + "-repo.json";
+                return System.getProperty("java.io.tmpdir") + File.separatorChar + fileName;
+            }
+        }
+
+        public UnleashConfig build() {
+            return new UnleashConfig(
+                    unleashAPI,
+                    customHttpHeaders,
+                    customHttpHeadersProvider,
+                    appName,
+                    environment,
+                    instanceId,
+                    sdkVersion,
+                    getBackupFile(),
+                    projectName,
+                    namePrefix,
+                    fetchTogglesInterval,
+                    sendMetricsInterval,
+                    disableMetrics,
+                    contextProvider,
+                    isProxyAuthenticationByJvmProperties,
+                    synchronousFetchOnInitialisation,
+                    Optional.ofNullable(scheduledExecutor)
+                            .orElseGet(UnleashScheduledExecutorImpl::getInstance),
+                    Optional.ofNullable(unleashSubscriber).orElseGet(NoOpSubscriber::new),
+                    fallbackStrategy,
+                    toggleBootstrapProvider,
+                    proxy,
+                    proxyAuthenticator);
+        }
+
+        public String getDefaultSdkVersion() {
+            String version =
+                    Optional.ofNullable(getClass().getPackage().getImplementationVersion())
+                            .orElse("development");
+            return "unleash-client-java:" + version;
+        }
+    }
+}
diff --git a/src/main/java/io/getunleash/util/UnleashScheduledExecutor.java b/src/main/java/io/getunleash/util/UnleashScheduledExecutor.java
new file mode 100644
index 00000000..948140d2
--- /dev/null
+++ b/src/main/java/io/getunleash/util/UnleashScheduledExecutor.java
@@ -0,0 +1,16 @@
+package io.getunleash.util;
+
+import io.getunleash.lang.Nullable;
+import java.util.concurrent.Future;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledFuture;
+
+public interface UnleashScheduledExecutor {
+    @Nullable
+    ScheduledFuture setInterval(Runnable command, long initialDelaySec, long periodSec)
+            throws RejectedExecutionException;
+
+    Future<Void> scheduleOnce(Runnable runnable);
+
+    public default void shutdown() {}
+}
diff --git a/src/main/java/no/finn/unleash/util/UnleashScheduledExecutorImpl.java b/src/main/java/io/getunleash/util/UnleashScheduledExecutorImpl.java
similarity index 96%
rename from src/main/java/no/finn/unleash/util/UnleashScheduledExecutorImpl.java
rename to src/main/java/io/getunleash/util/UnleashScheduledExecutorImpl.java
index bba76ec2..23b671fa 100644
--- a/src/main/java/no/finn/unleash/util/UnleashScheduledExecutorImpl.java
+++ b/src/main/java/io/getunleash/util/UnleashScheduledExecutorImpl.java
@@ -1,7 +1,7 @@
-package no.finn.unleash.util;
+package io.getunleash.util;
 
+import io.getunleash.lang.Nullable;
 import java.util.concurrent.*;
-import no.finn.unleash.lang.Nullable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/main/java/no/finn/unleash/util/UnleashURLs.java b/src/main/java/io/getunleash/util/UnleashURLs.java
similarity index 96%
rename from src/main/java/no/finn/unleash/util/UnleashURLs.java
rename to src/main/java/io/getunleash/util/UnleashURLs.java
index 25507c50..d5a39131 100644
--- a/src/main/java/no/finn/unleash/util/UnleashURLs.java
+++ b/src/main/java/io/getunleash/util/UnleashURLs.java
@@ -1,9 +1,9 @@
-package no.finn.unleash.util;
+package io.getunleash.util;
 
+import io.getunleash.lang.Nullable;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
-import no.finn.unleash.lang.Nullable;
 
 public class UnleashURLs {
     private final URL fetchTogglesURL;
diff --git a/src/main/java/io/getunleash/util/package-info.java b/src/main/java/io/getunleash/util/package-info.java
new file mode 100644
index 00000000..474d1e66
--- /dev/null
+++ b/src/main/java/io/getunleash/util/package-info.java
@@ -0,0 +1,6 @@
+@NonNullApi
+@NonNullFields
+package io.getunleash.util;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/variant/Payload.java b/src/main/java/io/getunleash/variant/Payload.java
similarity index 92%
rename from src/main/java/no/finn/unleash/variant/Payload.java
rename to src/main/java/io/getunleash/variant/Payload.java
index 661f1927..3b428e64 100644
--- a/src/main/java/no/finn/unleash/variant/Payload.java
+++ b/src/main/java/io/getunleash/variant/Payload.java
@@ -1,7 +1,7 @@
-package no.finn.unleash.variant;
+package io.getunleash.variant;
 
+import io.getunleash.lang.Nullable;
 import java.util.Objects;
-import no.finn.unleash.lang.Nullable;
 
 public class Payload {
     private String type;
diff --git a/src/main/java/no/finn/unleash/variant/VariantDefinition.java b/src/main/java/io/getunleash/variant/VariantDefinition.java
similarity index 93%
rename from src/main/java/no/finn/unleash/variant/VariantDefinition.java
rename to src/main/java/io/getunleash/variant/VariantDefinition.java
index eb1a4b98..74409933 100644
--- a/src/main/java/no/finn/unleash/variant/VariantDefinition.java
+++ b/src/main/java/io/getunleash/variant/VariantDefinition.java
@@ -1,9 +1,9 @@
-package no.finn.unleash.variant;
+package io.getunleash.variant;
 
+import io.getunleash.Variant;
+import io.getunleash.lang.Nullable;
 import java.util.Collections;
 import java.util.List;
-import no.finn.unleash.Variant;
-import no.finn.unleash.lang.Nullable;
 
 public class VariantDefinition {
 
diff --git a/src/main/java/no/finn/unleash/variant/VariantOverride.java b/src/main/java/io/getunleash/variant/VariantOverride.java
similarity index 92%
rename from src/main/java/no/finn/unleash/variant/VariantOverride.java
rename to src/main/java/io/getunleash/variant/VariantOverride.java
index 914d2377..39faa52a 100644
--- a/src/main/java/no/finn/unleash/variant/VariantOverride.java
+++ b/src/main/java/io/getunleash/variant/VariantOverride.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.variant;
+package io.getunleash.variant;
 
 import java.util.List;
 
diff --git a/src/main/java/no/finn/unleash/variant/VariantUtil.java b/src/main/java/io/getunleash/variant/VariantUtil.java
similarity index 94%
rename from src/main/java/no/finn/unleash/variant/VariantUtil.java
rename to src/main/java/io/getunleash/variant/VariantUtil.java
index 9cac061a..bcf863b3 100644
--- a/src/main/java/no/finn/unleash/variant/VariantUtil.java
+++ b/src/main/java/io/getunleash/variant/VariantUtil.java
@@ -1,14 +1,14 @@
-package no.finn.unleash.variant;
+package io.getunleash.variant;
 
+import io.getunleash.FeatureToggle;
+import io.getunleash.UnleashContext;
+import io.getunleash.Variant;
+import io.getunleash.lang.Nullable;
+import io.getunleash.strategy.StrategyUtils;
 import java.util.List;
 import java.util.Optional;
 import java.util.Random;
 import java.util.function.Predicate;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.UnleashContext;
-import no.finn.unleash.Variant;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.strategy.StrategyUtils;
 
 public final class VariantUtil {
     // Utility class
diff --git a/src/main/java/io/getunleash/variant/package-info.java b/src/main/java/io/getunleash/variant/package-info.java
new file mode 100644
index 00000000..381e582b
--- /dev/null
+++ b/src/main/java/io/getunleash/variant/package-info.java
@@ -0,0 +1,6 @@
+@NonNullFields
+@NonNullApi
+package io.getunleash.variant;
+
+import io.getunleash.lang.NonNullApi;
+import io.getunleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/CustomHttpProvider.java b/src/main/java/no/finn/unleash/CustomHttpProvider.java
new file mode 100644
index 00000000..c000eff0
--- /dev/null
+++ b/src/main/java/no/finn/unleash/CustomHttpProvider.java
@@ -0,0 +1,5 @@
+package no.finn.unleash;
+
+/** @deprecated Use {@link io.getunleash.CustomHttpHeadersProvider} */
+@Deprecated
+public interface CustomHttpProvider extends io.getunleash.CustomHttpHeadersProvider {}
diff --git a/src/main/java/no/finn/unleash/DefaultUnleash.java b/src/main/java/no/finn/unleash/DefaultUnleash.java
index 712e4bc6..776891e9 100644
--- a/src/main/java/no/finn/unleash/DefaultUnleash.java
+++ b/src/main/java/no/finn/unleash/DefaultUnleash.java
@@ -1,77 +1,27 @@
 package no.finn.unleash;
 
-import static java.util.Optional.ofNullable;
-import static no.finn.unleash.Variant.DISABLED_VARIANT;
-import static no.finn.unleash.variant.VariantUtil.selectVariant;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
+import io.getunleash.UnleashContextProvider;
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.metric.UnleashMetricService;
+import io.getunleash.repository.ToggleRepository;
+import io.getunleash.strategy.Strategy;
+import io.getunleash.util.UnleashConfig;
 import java.util.Map;
-import java.util.Optional;
-import java.util.function.BiFunction;
-import java.util.stream.Collectors;
-import no.finn.unleash.event.EventDispatcher;
-import no.finn.unleash.event.ToggleEvaluated;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.metric.UnleashMetricService;
-import no.finn.unleash.metric.UnleashMetricServiceImpl;
-import no.finn.unleash.repository.FeatureToggleRepository;
-import no.finn.unleash.repository.HttpToggleFetcher;
-import no.finn.unleash.repository.ToggleBackupHandlerFile;
-import no.finn.unleash.repository.ToggleRepository;
-import no.finn.unleash.strategy.*;
-import no.finn.unleash.util.UnleashConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public final class DefaultUnleash implements Unleash {
-    private static final Logger LOGGER = LoggerFactory.getLogger(DefaultUnleash.class);
-    private static final List<Strategy> BUILTIN_STRATEGIES =
-            Arrays.asList(
-                    new DefaultStrategy(),
-                    new ApplicationHostnameStrategy(),
-                    new GradualRolloutRandomStrategy(),
-                    new GradualRolloutSessionIdStrategy(),
-                    new GradualRolloutUserIdStrategy(),
-                    new RemoteAddressStrategy(),
-                    new UserWithIdStrategy(),
-                    new FlexibleRolloutStrategy());
-
-    public static final UnknownStrategy UNKNOWN_STRATEGY = new UnknownStrategy();
-
-    private final UnleashMetricService metricService;
-    private final ToggleRepository toggleRepository;
-    private final Map<String, Strategy> strategyMap;
-    private final UnleashContextProvider contextProvider;
-    private final EventDispatcher eventDispatcher;
-    private final UnleashConfig config;
-
-    private static FeatureToggleRepository defaultToggleRepository(UnleashConfig unleashConfig) {
-        return new FeatureToggleRepository(
-                unleashConfig,
-                new HttpToggleFetcher(unleashConfig),
-                new ToggleBackupHandlerFile(unleashConfig));
-    }
 
+/** @deprecated Use {@link io.getunleash.DefaultUnleash} (since v5.0.0) */
+@Deprecated
+public class DefaultUnleash extends io.getunleash.DefaultUnleash {
     public DefaultUnleash(UnleashConfig unleashConfig, Strategy... strategies) {
-        this(unleashConfig, defaultToggleRepository(unleashConfig), strategies);
+        super(unleashConfig, strategies);
     }
 
     public DefaultUnleash(
             UnleashConfig unleashConfig,
             ToggleRepository toggleRepository,
             Strategy... strategies) {
-        this(
-                unleashConfig,
-                toggleRepository,
-                buildStrategyMap(strategies),
-                unleashConfig.getContextProvider(),
-                new EventDispatcher(unleashConfig),
-                new UnleashMetricServiceImpl(unleashConfig, unleashConfig.getScheduledExecutor()));
+        super(unleashConfig, toggleRepository, strategies);
     }
 
-    // Visible for testing
     public DefaultUnleash(
             UnleashConfig unleashConfig,
             ToggleRepository toggleRepository,
@@ -79,211 +29,12 @@ public final class DefaultUnleash implements Unleash {
             UnleashContextProvider contextProvider,
             EventDispatcher eventDispatcher,
             UnleashMetricService metricService) {
-        this.config = unleashConfig;
-        this.toggleRepository = toggleRepository;
-        this.strategyMap = strategyMap;
-        this.contextProvider = contextProvider;
-        this.eventDispatcher = eventDispatcher;
-        this.metricService = metricService;
-        metricService.register(strategyMap.keySet());
-    }
-
-    @Override
-    public boolean isEnabled(final String toggleName) {
-        return isEnabled(toggleName, false);
-    }
-
-    @Override
-    public boolean isEnabled(final String toggleName, final boolean defaultSetting) {
-        return isEnabled(toggleName, contextProvider.getContext(), defaultSetting);
-    }
-
-    @Override
-    public boolean isEnabled(
-            final String toggleName, final UnleashContext context, final boolean defaultSetting) {
-        return isEnabled(toggleName, context, (n, c) -> defaultSetting);
-    }
-
-    @Override
-    public boolean isEnabled(
-            final String toggleName,
-            final BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        return isEnabled(toggleName, contextProvider.getContext(), fallbackAction);
-    }
-
-    @Override
-    public boolean isEnabled(
-            String toggleName,
-            UnleashContext context,
-            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        boolean enabled = checkEnabled(toggleName, context, fallbackAction);
-        count(toggleName, enabled);
-        eventDispatcher.dispatch(new ToggleEvaluated(toggleName, enabled));
-        return enabled;
-    }
-
-    private boolean checkEnabled(
-            String toggleName,
-            UnleashContext context,
-            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        checkIfToggleMatchesNamePrefix(toggleName);
-        FeatureToggle featureToggle = toggleRepository.getToggle(toggleName);
-        boolean enabled;
-        UnleashContext enhancedContext = context.applyStaticFields(config);
-
-        if (featureToggle == null) {
-            enabled = fallbackAction.apply(toggleName, enhancedContext);
-        } else if (!featureToggle.isEnabled()) {
-            enabled = false;
-        } else if (featureToggle.getStrategies().size() == 0) {
-            return true;
-        } else {
-            enabled =
-                    featureToggle.getStrategies().stream()
-                            .anyMatch(
-                                    strategy -> {
-                                        Strategy configuredStrategy =
-                                                getStrategy(strategy.getName());
-                                        if (configuredStrategy == UNKNOWN_STRATEGY) {
-                                            LOGGER.warn(
-                                                    "Unable to find matching strategy for toggle:{} strategy:{}",
-                                                    toggleName,
-                                                    strategy.getName());
-                                        }
-
-                                        return configuredStrategy.isEnabled(
-                                                strategy.getParameters(),
-                                                enhancedContext,
-                                                strategy.getConstraints());
-                                    });
-        }
-        return enabled;
-    }
-
-    private void checkIfToggleMatchesNamePrefix(String toggleName) {
-        if (config.getNamePrefix() != null) {
-            if (!toggleName.startsWith(config.getNamePrefix())) {
-                LOGGER.warn(
-                        "Toggle [{}] doesnt start with configured name prefix of [{}] so it will always be disabled",
-                        toggleName,
-                        config.getNamePrefix());
-            }
-        }
-    }
-
-    @Override
-    public Variant getVariant(String toggleName, UnleashContext context) {
-        return getVariant(toggleName, context, DISABLED_VARIANT);
-    }
-
-    @Override
-    public Variant getVariant(String toggleName, UnleashContext context, Variant defaultValue) {
-        FeatureToggle featureToggle = toggleRepository.getToggle(toggleName);
-        boolean enabled = checkEnabled(toggleName, context, (n, c) -> false);
-        Variant variant =
-                enabled ? selectVariant(featureToggle, context, defaultValue) : defaultValue;
-        metricService.countVariant(toggleName, variant.getName());
-        return variant;
-    }
-
-    @Override
-    public Variant getVariant(String toggleName) {
-        return getVariant(toggleName, contextProvider.getContext());
-    }
-
-    @Override
-    public Variant getVariant(String toggleName, Variant defaultValue) {
-        return getVariant(toggleName, contextProvider.getContext(), defaultValue);
-    }
-
-    public Optional<FeatureToggle> getFeatureToggleDefinition(String toggleName) {
-        return ofNullable(toggleRepository.getToggle(toggleName));
-    }
-
-    /**
-     * Use more().getFeatureToggleNames() instead
-     *
-     * @return a list of known toggle names
-     */
-    @Deprecated()
-    public List<String> getFeatureToggleNames() {
-        return toggleRepository.getFeatureNames();
-    }
-
-    /** Use more().count() instead */
-    @Deprecated
-    public void count(final String toggleName, boolean enabled) {
-        metricService.count(toggleName, enabled);
-    }
-
-    private static Map<String, Strategy> buildStrategyMap(@Nullable Strategy[] strategies) {
-        Map<String, Strategy> map = new HashMap<>();
-
-        BUILTIN_STRATEGIES.forEach(strategy -> map.put(strategy.getName(), strategy));
-
-        if (strategies != null) {
-            for (Strategy strategy : strategies) {
-                map.put(strategy.getName(), strategy);
-            }
-        }
-
-        return map;
-    }
-
-    private Strategy getStrategy(String strategy) {
-        return strategyMap.getOrDefault(strategy, config.getFallbackStrategy());
-    }
-
-    @Override
-    public void shutdown() {
-        config.getScheduledExecutor().shutdown();
-    }
-
-    @Override
-    public MoreOperations more() {
-        return new DefaultMore();
-    }
-
-    public class DefaultMore implements MoreOperations {
-
-        @Override
-        public List<String> getFeatureToggleNames() {
-            return toggleRepository.getFeatureNames();
-        }
-
-        @Override
-        public List<EvaluatedToggle> evaluateAllToggles() {
-            return evaluateAllToggles(contextProvider.getContext());
-        }
-
-        @Override
-        public List<EvaluatedToggle> evaluateAllToggles(UnleashContext context) {
-            return getFeatureToggleNames().stream()
-                    .map(
-                            toggleName -> {
-                                boolean enabled =
-                                        checkEnabled(toggleName, context, (n, c) -> false);
-                                FeatureToggle featureToggle =
-                                        toggleRepository.getToggle(toggleName);
-                                Variant variant =
-                                        enabled
-                                                ? selectVariant(
-                                                        featureToggle, context, DISABLED_VARIANT)
-                                                : DISABLED_VARIANT;
-
-                                return new EvaluatedToggle(toggleName, enabled, variant);
-                            })
-                    .collect(Collectors.toList());
-        }
-
-        @Override
-        public void count(final String toggleName, boolean enabled) {
-            metricService.count(toggleName, enabled);
-        }
-
-        @Override
-        public void countVariant(final String toggleName, String variantName) {
-            metricService.countVariant(toggleName, variantName);
-        }
+        super(
+                unleashConfig,
+                toggleRepository,
+                strategyMap,
+                contextProvider,
+                eventDispatcher,
+                metricService);
     }
 }
diff --git a/src/main/java/no/finn/unleash/FakeUnleash.java b/src/main/java/no/finn/unleash/FakeUnleash.java
index d3e1d38e..2962fb28 100644
--- a/src/main/java/no/finn/unleash/FakeUnleash.java
+++ b/src/main/java/no/finn/unleash/FakeUnleash.java
@@ -1,158 +1,9 @@
 package no.finn.unleash;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.function.BiFunction;
-import java.util.stream.Collectors;
-import no.finn.unleash.lang.Nullable;
-
-public final class FakeUnleash implements Unleash {
-    private boolean enableAll = false;
-    private boolean disableAll = false;
-    private Map<String, Boolean> features = new HashMap<>();
-    private Map<String, Variant> variants = new HashMap<>();
-
-    @Override
-    public boolean isEnabled(String toggleName) {
-        return isEnabled(toggleName, false);
-    }
-
-    @Override
-    public boolean isEnabled(String toggleName, boolean defaultSetting) {
-        if (enableAll) {
-            return true;
-        } else if (disableAll) {
-            return false;
-        } else {
-            return features.getOrDefault(toggleName, defaultSetting);
-        }
-    }
-
-    @Override
-    public boolean isEnabled(
-            String toggleName,
-            UnleashContext context,
-            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        return isEnabled(toggleName, fallbackAction);
-    }
-
-    @Override
-    public boolean isEnabled(
-            String toggleName, BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        if (!features.containsKey(toggleName)) {
-            return fallbackAction.apply(toggleName, UnleashContext.builder().build());
-        }
-        return isEnabled(toggleName);
-    }
-
-    @Override
-    public Variant getVariant(String toggleName, UnleashContext context) {
-        return getVariant(toggleName, Variant.DISABLED_VARIANT);
-    }
-
-    @Override
-    public Variant getVariant(String toggleName, UnleashContext context, Variant defaultValue) {
-        return getVariant(toggleName, defaultValue);
-    }
-
-    @Override
-    public Variant getVariant(String toggleName) {
-        return getVariant(toggleName, Variant.DISABLED_VARIANT);
-    }
-
-    @Override
-    public Variant getVariant(String toggleName, Variant defaultValue) {
-        if (isEnabled(toggleName) && variants.containsKey(toggleName)) {
-            return variants.get(toggleName);
-        } else {
-            return defaultValue;
-        }
-    }
-
-    @Override
-    public List<String> getFeatureToggleNames() {
-        return more().getFeatureToggleNames();
-    }
-
-    @Override
-    public MoreOperations more() {
-        return new FakeMore();
-    }
-
-    public void enableAll() {
-        disableAll = false;
-        enableAll = true;
-        features.clear();
-    }
-
-    public void disableAll() {
-        disableAll = true;
-        enableAll = false;
-        features.clear();
-    }
-
-    public void resetAll() {
-        disableAll = false;
-        enableAll = false;
-        features.clear();
-        variants.clear();
-    }
-
-    public void enable(String... features) {
-        for (String name : features) {
-            this.features.put(name, true);
-        }
-    }
-
-    public void disable(String... features) {
-        for (String name : features) {
-            this.features.put(name, false);
-        }
-    }
-
-    public void reset(String... features) {
-        for (String name : features) {
-            this.features.remove(name);
-        }
-    }
-
-    public void setVariant(String t1, Variant a) {
-        variants.put(t1, a);
-    }
-
-    public class FakeMore implements MoreOperations {
-
-        @Override
-        public List<String> getFeatureToggleNames() {
-            return new ArrayList<>(features.keySet());
-        }
-
-        @Override
-        public List<EvaluatedToggle> evaluateAllToggles() {
-            return evaluateAllToggles(null);
-        }
-
-        @Override
-        public List<EvaluatedToggle> evaluateAllToggles(@Nullable UnleashContext context) {
-            return getFeatureToggleNames().stream()
-                    .map(
-                            toggleName -> {
-                                return new EvaluatedToggle(
-                                        toggleName, isEnabled(toggleName), getVariant(toggleName));
-                            })
-                    .collect(Collectors.toList());
-        }
-
-        @Override
-        public void count(String toggleName, boolean enabled) {
-            // Nothing to count
-        }
-
-        @Override
-        public void countVariant(String toggleName, String variantName) {
-            // Nothing to count
-        }
-    }
+/**
+ * @deprecated Use {@link io.getunleash.FakeUnleash}
+ **/
+@Deprecated
+public class FakeUnleash extends io.getunleash.FakeUnleash {
+    public FakeUnleash() {}
 }
diff --git a/src/main/java/no/finn/unleash/Unleash.java b/src/main/java/no/finn/unleash/Unleash.java
index 05b0b1e5..0ad029ed 100644
--- a/src/main/java/no/finn/unleash/Unleash.java
+++ b/src/main/java/no/finn/unleash/Unleash.java
@@ -1,51 +1,5 @@
 package no.finn.unleash;
 
-import java.util.List;
-import java.util.function.BiFunction;
-
-public interface Unleash {
-    boolean isEnabled(String toggleName);
-
-    boolean isEnabled(String toggleName, boolean defaultSetting);
-
-    default boolean isEnabled(String toggleName, UnleashContext context) {
-        return isEnabled(toggleName, context, false);
-    }
-
-    default boolean isEnabled(String toggleName, UnleashContext context, boolean defaultSetting) {
-        return isEnabled(toggleName, defaultSetting);
-    }
-
-    default boolean isEnabled(
-            String toggleName, BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        return isEnabled(toggleName, false);
-    }
-
-    default boolean isEnabled(
-            String toggleName,
-            UnleashContext context,
-            BiFunction<String, UnleashContext, Boolean> fallbackAction) {
-        return isEnabled(toggleName, context, false);
-    }
-
-    Variant getVariant(final String toggleName, final UnleashContext context);
-
-    Variant getVariant(
-            final String toggleName, final UnleashContext context, final Variant defaultValue);
-
-    Variant getVariant(final String toggleName);
-
-    Variant getVariant(final String toggleName, final Variant defaultValue);
-
-    /**
-     * Use more().getFeatureToggleNames() instead
-     *
-     * @return a list of known toggle names
-     */
-    @Deprecated()
-    List<String> getFeatureToggleNames();
-
-    default void shutdown() {}
-
-    MoreOperations more();
-}
+/** @deprecated Use {@link io.getunleash.Unleash} */
+@Deprecated
+public interface Unleash extends io.getunleash.Unleash {}
diff --git a/src/main/java/no/finn/unleash/UnleashContext.java b/src/main/java/no/finn/unleash/UnleashContext.java
index d5c0c4ab..c1422ebc 100644
--- a/src/main/java/no/finn/unleash/UnleashContext.java
+++ b/src/main/java/no/finn/unleash/UnleashContext.java
@@ -1,149 +1,22 @@
 package no.finn.unleash;
 
-import java.util.HashMap;
 import java.util.Map;
-import java.util.Optional;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.util.UnleashConfig;
-
-public class UnleashContext {
-    private final Optional<String> appName;
-    private final Optional<String> environment;
-    private final Optional<String> userId;
-    private final Optional<String> sessionId;
-    private final Optional<String> remoteAddress;
-
-    private final Map<String, String> properties;
 
+/** @deprecated use {@link io.getunleash.UnleashContext} */
+@Deprecated
+public class UnleashContext extends io.getunleash.UnleashContext {
     public UnleashContext(
             String userId, String sessionId, String remoteAddress, Map<String, String> properties) {
-        this(null, null, userId, sessionId, remoteAddress, properties);
+        super(userId, sessionId, remoteAddress, properties);
     }
 
     public UnleashContext(
-            @Nullable String appName,
-            @Nullable String environment,
-            @Nullable String userId,
-            @Nullable String sessionId,
-            @Nullable String remoteAddress,
+            String appName,
+            String environment,
+            String userId,
+            String sessionId,
+            String remoteAddress,
             Map<String, String> properties) {
-        this.appName = Optional.ofNullable(appName);
-        this.environment = Optional.ofNullable(environment);
-        this.userId = Optional.ofNullable(userId);
-        this.sessionId = Optional.ofNullable(sessionId);
-        this.remoteAddress = Optional.ofNullable(remoteAddress);
-        this.properties = properties;
-    }
-
-    public Optional<String> getUserId() {
-        return userId;
-    }
-
-    public Optional<String> getSessionId() {
-        return sessionId;
-    }
-
-    public Optional<String> getRemoteAddress() {
-        return remoteAddress;
-    }
-
-    public Map<String, String> getProperties() {
-        return properties;
-    }
-
-    public Optional<String> getAppName() {
-        return appName;
-    }
-
-    public Optional<String> getEnvironment() {
-        return environment;
-    }
-
-    public Optional<String> getByName(String contextName) {
-        switch (contextName) {
-            case "environment":
-                return environment;
-            case "appName":
-                return appName;
-            case "userId":
-                return userId;
-            case "sessionId":
-                return sessionId;
-            case "remoteAddress":
-                return remoteAddress;
-            default:
-                return Optional.ofNullable(properties.get(contextName));
-        }
-    }
-
-    public UnleashContext applyStaticFields(UnleashConfig config) {
-        Builder builder = new Builder(this);
-        if (!this.environment.isPresent()) {
-            builder.environment(config.getEnvironment());
-        }
-        if (!this.appName.isPresent()) {
-            builder.appName(config.getAppName());
-        }
-        return builder.build();
-    }
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    public static class Builder {
-        @Nullable private String appName;
-        @Nullable private String environment;
-        @Nullable private String userId;
-        @Nullable private String sessionId;
-        @Nullable private String remoteAddress;
-
-        private final Map<String, String> properties = new HashMap<>();
-
-        public Builder() {}
-
-        public Builder(UnleashContext context) {
-            context.appName.ifPresent(val -> this.appName = val);
-            context.environment.ifPresent(val -> this.environment = val);
-            context.userId.ifPresent(val -> this.userId = val);
-            context.sessionId.ifPresent(val -> this.sessionId = val);
-            context.remoteAddress.ifPresent(val -> this.remoteAddress = val);
-            context.properties.forEach(this.properties::put);
-        }
-
-        public Builder appName(String appName) {
-            this.appName = appName;
-            return this;
-        }
-
-        public Builder environment(String environment) {
-            this.environment = environment;
-            return this;
-        }
-
-        public Builder userId(String userId) {
-            this.userId = userId;
-            return this;
-        }
-
-        public Builder sessionId(String sessionId) {
-            this.sessionId = sessionId;
-            return this;
-        }
-
-        public Builder remoteAddress(String remoteAddress) {
-            this.remoteAddress = remoteAddress;
-            return this;
-        }
-
-        public Builder addProperty(String name, String value) {
-            properties.put(name, value);
-            return this;
-        }
-
-        public UnleashContext build() {
-            return new UnleashContext(
-                    appName, environment, userId, sessionId, remoteAddress, properties);
-        }
+        super(appName, environment, userId, sessionId, remoteAddress, properties);
     }
 }
diff --git a/src/main/java/no/finn/unleash/UnleashContextProvider.java b/src/main/java/no/finn/unleash/UnleashContextProvider.java
index 213129da..3e483809 100644
--- a/src/main/java/no/finn/unleash/UnleashContextProvider.java
+++ b/src/main/java/no/finn/unleash/UnleashContextProvider.java
@@ -1,9 +1,5 @@
 package no.finn.unleash;
 
-public interface UnleashContextProvider {
-    UnleashContext getContext();
-
-    static UnleashContextProvider getDefaultProvider() {
-        return () -> UnleashContext.builder().build();
-    }
-}
+/** @deprecated Use {@link io.getunleash.UnleashContextProvider} */
+@Deprecated
+public interface UnleashContextProvider extends io.getunleash.UnleashContextProvider {}
diff --git a/src/main/java/no/finn/unleash/event/UnleashSubscriber.java b/src/main/java/no/finn/unleash/event/UnleashSubscriber.java
index 8ef0c473..8f3248f1 100644
--- a/src/main/java/no/finn/unleash/event/UnleashSubscriber.java
+++ b/src/main/java/no/finn/unleash/event/UnleashSubscriber.java
@@ -1,34 +1,5 @@
 package no.finn.unleash.event;
 
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.metric.ClientMetrics;
-import no.finn.unleash.metric.ClientRegistration;
-import no.finn.unleash.repository.FeatureToggleResponse;
-import no.finn.unleash.repository.ToggleCollection;
-import org.slf4j.LoggerFactory;
-
-public interface UnleashSubscriber {
-
-    default void onError(UnleashException unleashException) {
-        LoggerFactory.getLogger(UnleashSubscriber.class)
-                .warn(unleashException.getMessage(), unleashException);
-    }
-
-    default void on(UnleashEvent unleashEvent) {}
-
-    default void onReady(UnleashReady unleashReady) {}
-
-    default void toggleEvaluated(ToggleEvaluated toggleEvaluated) {}
-
-    default void togglesFetched(FeatureToggleResponse toggleResponse) {}
-
-    default void clientMetrics(ClientMetrics clientMetrics) {}
-
-    default void clientRegistered(ClientRegistration clientRegistration) {}
-
-    default void togglesBackedUp(ToggleCollection toggleCollection) {}
-
-    default void toggleBackupRestored(ToggleCollection toggleCollection) {}
-
-    default void togglesBootstrapped(ToggleCollection toggleCollection) {}
-}
+/** @deprecated Use {@link io.getunleash.event.UnleashSubscriber} */
+@Deprecated
+public interface UnleashSubscriber extends io.getunleash.event.UnleashSubscriber {}
diff --git a/src/main/java/no/finn/unleash/event/package-info.java b/src/main/java/no/finn/unleash/event/package-info.java
deleted file mode 100644
index ef0dcce1..00000000
--- a/src/main/java/no/finn/unleash/event/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullApi
-@NonNullFields
-package no.finn.unleash.event;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/metric/UnleashMetricService.java b/src/main/java/no/finn/unleash/metric/UnleashMetricService.java
index 818a630a..8ddcaeb7 100644
--- a/src/main/java/no/finn/unleash/metric/UnleashMetricService.java
+++ b/src/main/java/no/finn/unleash/metric/UnleashMetricService.java
@@ -1,11 +1,5 @@
 package no.finn.unleash.metric;
 
-import java.util.Set;
-
-public interface UnleashMetricService {
-    void register(Set<String> strategies);
-
-    void count(String toggleName, boolean active);
-
-    void countVariant(String toggleName, String variantName);
-}
+/** @deprecated Use {@link io.getunleash.metric.UnleashMetricService} */
+@Deprecated()
+public interface UnleashMetricService extends io.getunleash.metric.UnleashMetricService {}
diff --git a/src/main/java/no/finn/unleash/metric/package-info.java b/src/main/java/no/finn/unleash/metric/package-info.java
deleted file mode 100644
index 649d7282..00000000
--- a/src/main/java/no/finn/unleash/metric/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullApi
-@NonNullFields
-package no.finn.unleash.metric;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/package-info.java b/src/main/java/no/finn/unleash/package-info.java
deleted file mode 100644
index 3aad9f27..00000000
--- a/src/main/java/no/finn/unleash/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullApi
-@NonNullFields
-package no.finn.unleash;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/repository/package-info.java b/src/main/java/no/finn/unleash/repository/package-info.java
deleted file mode 100644
index 6c1e2b71..00000000
--- a/src/main/java/no/finn/unleash/repository/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullApi
-@NonNullFields
-package no.finn.unleash.repository;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/strategy/package-info.java b/src/main/java/no/finn/unleash/strategy/package-info.java
deleted file mode 100644
index a0d5f7ed..00000000
--- a/src/main/java/no/finn/unleash/strategy/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullFields
-@NonNullApi
-package no.finn.unleash.strategy;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/util/UnleashConfig.java b/src/main/java/no/finn/unleash/util/UnleashConfig.java
index c435a12b..fd0b01b8 100644
--- a/src/main/java/no/finn/unleash/util/UnleashConfig.java
+++ b/src/main/java/no/finn/unleash/util/UnleashConfig.java
@@ -1,491 +1,9 @@
 package no.finn.unleash.util;
 
-import static no.finn.unleash.DefaultUnleash.UNKNOWN_STRATEGY;
-
-import java.io.File;
-import java.net.*;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import no.finn.unleash.CustomHttpHeadersProvider;
-import no.finn.unleash.DefaultCustomHttpHeadersProviderImpl;
-import no.finn.unleash.UnleashContextProvider;
-import no.finn.unleash.event.NoOpSubscriber;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.lang.Nullable;
-import no.finn.unleash.repository.ToggleBootstrapProvider;
-import no.finn.unleash.strategy.Strategy;
-
+/** @deprecated Use {@link io.getunleash.util.UnleashConfig} */
+@Deprecated
 public class UnleashConfig {
-
-    static final String UNLEASH_APP_NAME_HEADER = "UNLEASH-APPNAME";
-    static final String UNLEASH_INSTANCE_ID_HEADER = "UNLEASH-INSTANCEID";
-
-    private final URI unleashAPI;
-    private final UnleashURLs unleashURLs;
-    private final Map<String, String> customHttpHeaders;
-    private final CustomHttpHeadersProvider customHttpHeadersProvider;
-    private final String appName;
-    private final String environment;
-    private final String instanceId;
-    private final String sdkVersion;
-    private final String backupFile;
-    @Nullable private final String projectName;
-    @Nullable private final String namePrefix;
-    private final long fetchTogglesInterval;
-    private final long sendMetricsInterval;
-    private final boolean disableMetrics;
-    private final boolean isProxyAuthenticationByJvmProperties;
-    private final UnleashContextProvider contextProvider;
-    private final boolean synchronousFetchOnInitialisation;
-    private final UnleashScheduledExecutor unleashScheduledExecutor;
-    private final UnleashSubscriber unleashSubscriber;
-    @Nullable private final Strategy fallbackStrategy;
-    @Nullable private final ToggleBootstrapProvider toggleBootstrapProvider;
-    @Nullable private final Proxy proxy;
-
-    private UnleashConfig(
-            @Nullable URI unleashAPI,
-            Map<String, String> customHttpHeaders,
-            CustomHttpHeadersProvider customHttpHeadersProvider,
-            @Nullable String appName,
-            String environment,
-            @Nullable String instanceId,
-            String sdkVersion,
-            String backupFile,
-            @Nullable String projectName,
-            @Nullable String namePrefix,
-            long fetchTogglesInterval,
-            long sendMetricsInterval,
-            boolean disableMetrics,
-            UnleashContextProvider contextProvider,
-            boolean isProxyAuthenticationByJvmProperties,
-            boolean synchronousFetchOnInitialisation,
-            @Nullable UnleashScheduledExecutor unleashScheduledExecutor,
-            @Nullable UnleashSubscriber unleashSubscriber,
-            @Nullable Strategy fallbackStrategy,
-            @Nullable ToggleBootstrapProvider unleashBootstrapProvider,
-            @Nullable Proxy proxy,
-            @Nullable Authenticator proxyAuthenticator) {
-
-        if (appName == null) {
-            throw new IllegalStateException("You are required to specify the unleash appName");
-        }
-
-        if (instanceId == null) {
-            throw new IllegalStateException("You are required to specify the unleash instanceId");
-        }
-
-        if (unleashAPI == null) {
-            throw new IllegalStateException("You are required to specify the unleashAPI url");
-        }
-
-        if (unleashScheduledExecutor == null) {
-            throw new IllegalStateException("You are required to specify a scheduler");
-        }
-
-        if (unleashSubscriber == null) {
-            throw new IllegalStateException("You are required to specify a subscriber");
-        }
-
-        if (fallbackStrategy == null) {
-            this.fallbackStrategy = UNKNOWN_STRATEGY;
-        } else {
-            this.fallbackStrategy = fallbackStrategy;
-        }
-
-        if (isProxyAuthenticationByJvmProperties && proxyAuthenticator == null) {
-            enableProxyAuthentication();
-        } else if (proxyAuthenticator != null) {
-            Authenticator.setDefault(proxyAuthenticator);
-        }
-
-        this.unleashAPI = unleashAPI;
-        this.customHttpHeaders = customHttpHeaders;
-        this.customHttpHeadersProvider = customHttpHeadersProvider;
-        this.unleashURLs = new UnleashURLs(unleashAPI);
-        this.appName = appName;
-        this.environment = environment;
-        this.instanceId = instanceId;
-        this.sdkVersion = sdkVersion;
-        this.backupFile = backupFile;
-        this.projectName = projectName;
-        this.namePrefix = namePrefix;
-        this.fetchTogglesInterval = fetchTogglesInterval;
-        this.sendMetricsInterval = sendMetricsInterval;
-        this.disableMetrics = disableMetrics;
-        this.contextProvider = contextProvider;
-        this.isProxyAuthenticationByJvmProperties = isProxyAuthenticationByJvmProperties;
-        this.synchronousFetchOnInitialisation = synchronousFetchOnInitialisation;
-        this.unleashScheduledExecutor = unleashScheduledExecutor;
-        this.unleashSubscriber = unleashSubscriber;
-        this.toggleBootstrapProvider = unleashBootstrapProvider;
-        this.proxy = proxy;
-    }
-
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    public static void setRequestProperties(HttpURLConnection connection, UnleashConfig config) {
-        connection.setRequestProperty(UNLEASH_APP_NAME_HEADER, config.getAppName());
-        connection.setRequestProperty(UNLEASH_INSTANCE_ID_HEADER, config.getInstanceId());
-        connection.setRequestProperty("User-Agent", config.getAppName());
-        config.getCustomHttpHeaders().forEach(connection::setRequestProperty);
-        config.customHttpHeadersProvider.getCustomHeaders().forEach(connection::setRequestProperty);
-    }
-
-    private void enableProxyAuthentication() {
-        // http.proxyUser http.proxyPassword is only consumed by Apache HTTP Client, for
-        // HttpUrlConnection we have to define an Authenticator
-        Authenticator.setDefault(new SystemProxyAuthenticator());
-    }
-
-    public URI getUnleashAPI() {
-        return unleashAPI;
-    }
-
-    public Map<String, String> getCustomHttpHeaders() {
-        return customHttpHeaders;
-    }
-
-    public CustomHttpHeadersProvider getCustomHttpHeadersProvider() {
-        return customHttpHeadersProvider;
-    }
-
-    public String getAppName() {
-        return appName;
-    }
-
-    public String getEnvironment() {
-        return environment;
-    }
-
-    public String getInstanceId() {
-        return instanceId;
-    }
-
-    public String getSdkVersion() {
-        return sdkVersion;
-    }
-
-    public @Nullable String getProjectName() {
-        return projectName;
-    }
-
-    public long getFetchTogglesInterval() {
-        return fetchTogglesInterval;
-    }
-
-    public long getSendMetricsInterval() {
-        return sendMetricsInterval;
-    }
-
-    public UnleashURLs getUnleashURLs() {
-        return unleashURLs;
-    }
-
-    public boolean isDisableMetrics() {
-        return disableMetrics;
-    }
-
-    public String getBackupFile() {
-        return this.backupFile;
-    }
-
-    public boolean isSynchronousFetchOnInitialisation() {
-        return synchronousFetchOnInitialisation;
-    }
-
-    public UnleashContextProvider getContextProvider() {
-        return contextProvider;
-    }
-
-    public UnleashScheduledExecutor getScheduledExecutor() {
-        return unleashScheduledExecutor;
-    }
-
-    public UnleashSubscriber getSubscriber() {
-        return unleashSubscriber;
-    }
-
-    public boolean isProxyAuthenticationByJvmProperties() {
-        return isProxyAuthenticationByJvmProperties;
-    }
-
-    @Nullable
-    public Strategy getFallbackStrategy() {
-        return fallbackStrategy;
-    }
-
-    @Nullable
-    public ToggleBootstrapProvider getToggleBootstrapProvider() {
-        return toggleBootstrapProvider;
-    }
-
-    @Nullable
-    public String getNamePrefix() {
-        return namePrefix;
-    }
-
-    @Nullable
-    public Proxy getProxy() {
-        return proxy;
-    }
-
-    static class SystemProxyAuthenticator extends Authenticator {
-        @Override
-        protected @Nullable PasswordAuthentication getPasswordAuthentication() {
-            if (getRequestorType() == RequestorType.PROXY) {
-                final String proto = getRequestingProtocol().toLowerCase();
-                final String proxyHost = System.getProperty(proto + ".proxyHost", "");
-                final String proxyPort = System.getProperty(proto + ".proxyPort", "");
-                final String proxyUser = System.getProperty(proto + ".proxyUser", "");
-                final String proxyPassword = System.getProperty(proto + ".proxyPassword", "");
-
-                // Only apply PasswordAuthentication to requests to the proxy itself - if not set
-                // just ignore
-                if (getRequestingHost().equalsIgnoreCase(proxyHost)
-                        && Integer.parseInt(proxyPort) == getRequestingPort()) {
-                    return new PasswordAuthentication(proxyUser, proxyPassword.toCharArray());
-                }
-            }
-            return null;
-        }
-    }
-
-    static class CustomProxyAuthenticator extends Authenticator {
-
-        private final Proxy proxy;
-        private final String proxyUser;
-        private final String proxyPassword;
-
-        public CustomProxyAuthenticator(Proxy proxy, String proxyUser, String proxyPassword) {
-            this.proxy = proxy;
-            this.proxyUser = proxyUser;
-            this.proxyPassword = proxyPassword;
-        }
-
-        @Override
-        protected @Nullable PasswordAuthentication getPasswordAuthentication() {
-            if (getRequestorType() == RequestorType.PROXY
-                    && proxy.type() == Proxy.Type.HTTP
-                    && proxy.address() instanceof InetSocketAddress) {
-                final String proxyHost = ((InetSocketAddress) proxy.address()).getHostName();
-                final int proxyPort = ((InetSocketAddress) proxy.address()).getPort();
-
-                // Only apply PasswordAuthentication to requests to the proxy
-                // itself - if not set
-                // just ignore
-                if (getRequestingHost().equalsIgnoreCase(proxyHost)
-                        && proxyPort == getRequestingPort()) {
-                    return new PasswordAuthentication(proxyUser, proxyPassword.toCharArray());
-                }
-            }
-            return null;
-        }
-    }
-
-    public static class Builder {
-
-        private @Nullable URI unleashAPI;
-        private Map<String, String> customHttpHeaders = new HashMap<>();
-        private CustomHttpHeadersProvider customHttpHeadersProvider =
-                new DefaultCustomHttpHeadersProviderImpl();
-        private @Nullable String appName;
-        private String environment = "default";
-        private String instanceId = getDefaultInstanceId();
-        private final String sdkVersion = getDefaultSdkVersion();
-        private @Nullable String backupFile;
-        private @Nullable String projectName;
-        private @Nullable String namePrefix;
-        private long fetchTogglesInterval = 10;
-        private long sendMetricsInterval = 60;
-        private boolean disableMetrics = false;
-        private UnleashContextProvider contextProvider =
-                UnleashContextProvider.getDefaultProvider();
-        private boolean synchronousFetchOnInitialisation = false;
-        private @Nullable UnleashScheduledExecutor scheduledExecutor;
-        private @Nullable UnleashSubscriber unleashSubscriber;
-        private boolean isProxyAuthenticationByJvmProperties;
-        private @Nullable Strategy fallbackStrategy;
-        private @Nullable ToggleBootstrapProvider toggleBootstrapProvider;
-        private @Nullable Proxy proxy;
-        private @Nullable Authenticator proxyAuthenticator;
-
-        private static String getHostname() {
-            String hostName = System.getProperty("hostname");
-            if (hostName == null || hostName.length() == 0) {
-                try {
-                    hostName = InetAddress.getLocalHost().getHostName();
-                } catch (UnknownHostException e) {
-                }
-            }
-            return hostName + "-";
-        }
-
-        static String getDefaultInstanceId() {
-            return getHostname() + "generated-" + Math.round(Math.random() * 1000000.0D);
-        }
-
-        public Builder unleashAPI(URI unleashAPI) {
-            this.unleashAPI = unleashAPI;
-            return this;
-        }
-
-        public Builder unleashAPI(String unleashAPI) {
-            this.unleashAPI = URI.create(unleashAPI);
-            return this;
-        }
-
-        public Builder customHttpHeader(String name, String value) {
-            this.customHttpHeaders.put(name, value);
-            return this;
-        }
-
-        public Builder customHttpHeadersProvider(CustomHttpHeadersProvider provider) {
-            this.customHttpHeadersProvider = provider;
-            return this;
-        }
-
-        public Builder appName(String appName) {
-            this.appName = appName;
-            return this;
-        }
-
-        public Builder environment(String environment) {
-            this.environment = environment;
-            return this;
-        }
-
-        public Builder instanceId(String instanceId) {
-            this.instanceId = instanceId;
-            return this;
-        }
-
-        public Builder projectName(String projectName) {
-            this.projectName = projectName;
-            return this;
-        }
-
-        public Builder namePrefix(String namePrefix) {
-            this.namePrefix = namePrefix;
-            return this;
-        }
-
-        public Builder fetchTogglesInterval(long fetchTogglesInterval) {
-            this.fetchTogglesInterval = fetchTogglesInterval;
-            return this;
-        }
-
-        public Builder sendMetricsInterval(long sendMetricsInterval) {
-            this.sendMetricsInterval = sendMetricsInterval;
-            return this;
-        }
-
-        public Builder disableMetrics() {
-            this.disableMetrics = true;
-            return this;
-        }
-
-        public Builder backupFile(String backupFile) {
-            this.backupFile = backupFile;
-            return this;
-        }
-
-        public Builder enableProxyAuthenticationByJvmProperties() {
-            this.isProxyAuthenticationByJvmProperties = true;
-            return this;
-        }
-
-        public Builder unleashContextProvider(UnleashContextProvider contextProvider) {
-            this.contextProvider = contextProvider;
-            return this;
-        }
-
-        public Builder synchronousFetchOnInitialisation(boolean enable) {
-            this.synchronousFetchOnInitialisation = enable;
-            return this;
-        }
-
-        public Builder scheduledExecutor(UnleashScheduledExecutor scheduledExecutor) {
-            this.scheduledExecutor = scheduledExecutor;
-            return this;
-        }
-
-        public Builder subscriber(UnleashSubscriber unleashSubscriber) {
-            this.unleashSubscriber = unleashSubscriber;
-            return this;
-        }
-
-        public Builder fallbackStrategy(@Nullable Strategy fallbackStrategy) {
-            this.fallbackStrategy = fallbackStrategy;
-            return this;
-        }
-
-        public Builder toggleBootstrapProvider(
-                @Nullable ToggleBootstrapProvider toggleBootstrapProvider) {
-            this.toggleBootstrapProvider = toggleBootstrapProvider;
-            return this;
-        }
-
-        public Builder proxy(Proxy proxy) {
-            this.proxy = proxy;
-            return this;
-        }
-
-        public Builder proxy(
-                Proxy proxy, @Nullable String proxyUser, @Nullable String proxyPassword) {
-            this.proxy = proxy;
-
-            if (proxyUser != null && proxyPassword != null) {
-                this.proxyAuthenticator =
-                        new CustomProxyAuthenticator(proxy, proxyUser, proxyPassword);
-            }
-            return this;
-        }
-
-        private String getBackupFile() {
-            if (backupFile != null) {
-                return backupFile;
-            } else {
-                String fileName = "unleash-" + appName + "-repo.json";
-                return System.getProperty("java.io.tmpdir") + File.separatorChar + fileName;
-            }
-        }
-
-        public UnleashConfig build() {
-            return new UnleashConfig(
-                    unleashAPI,
-                    customHttpHeaders,
-                    customHttpHeadersProvider,
-                    appName,
-                    environment,
-                    instanceId,
-                    sdkVersion,
-                    getBackupFile(),
-                    projectName,
-                    namePrefix,
-                    fetchTogglesInterval,
-                    sendMetricsInterval,
-                    disableMetrics,
-                    contextProvider,
-                    isProxyAuthenticationByJvmProperties,
-                    synchronousFetchOnInitialisation,
-                    Optional.ofNullable(scheduledExecutor)
-                            .orElseGet(UnleashScheduledExecutorImpl::getInstance),
-                    Optional.ofNullable(unleashSubscriber).orElseGet(NoOpSubscriber::new),
-                    fallbackStrategy,
-                    toggleBootstrapProvider,
-                    proxy,
-                    proxyAuthenticator);
-        }
-
-        public String getDefaultSdkVersion() {
-            String version =
-                    Optional.ofNullable(getClass().getPackage().getImplementationVersion())
-                            .orElse("development");
-            return "unleash-client-java:" + version;
-        }
+    public static io.getunleash.util.UnleashConfig.Builder builder() {
+        return io.getunleash.util.UnleashConfig.builder();
     }
 }
diff --git a/src/main/java/no/finn/unleash/util/UnleashScheduledExecutor.java b/src/main/java/no/finn/unleash/util/UnleashScheduledExecutor.java
index 1b0fd300..3b0cf54f 100644
--- a/src/main/java/no/finn/unleash/util/UnleashScheduledExecutor.java
+++ b/src/main/java/no/finn/unleash/util/UnleashScheduledExecutor.java
@@ -1,16 +1,5 @@
 package no.finn.unleash.util;
 
-import java.util.concurrent.Future;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.ScheduledFuture;
-import no.finn.unleash.lang.Nullable;
-
-public interface UnleashScheduledExecutor {
-    @Nullable
-    ScheduledFuture setInterval(Runnable command, long initialDelaySec, long periodSec)
-            throws RejectedExecutionException;
-
-    Future<Void> scheduleOnce(Runnable runnable);
-
-    public default void shutdown() {}
-}
+/** @deprecated Use {@link io.getunleash.util.UnleashScheduledExecutor} */
+@Deprecated
+public interface UnleashScheduledExecutor extends io.getunleash.util.UnleashScheduledExecutor {}
diff --git a/src/main/java/no/finn/unleash/util/package-info.java b/src/main/java/no/finn/unleash/util/package-info.java
deleted file mode 100644
index 49bb5e80..00000000
--- a/src/main/java/no/finn/unleash/util/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullApi
-@NonNullFields
-package no.finn.unleash.util;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;
diff --git a/src/main/java/no/finn/unleash/variant/package-info.java b/src/main/java/no/finn/unleash/variant/package-info.java
deleted file mode 100644
index a3fc381d..00000000
--- a/src/main/java/no/finn/unleash/variant/package-info.java
+++ /dev/null
@@ -1,6 +0,0 @@
-@NonNullFields
-@NonNullApi
-package no.finn.unleash.variant;
-
-import no.finn.unleash.lang.NonNullApi;
-import no.finn.unleash.lang.NonNullFields;


Test patch:
diff --git a/src/test/java/no/finn/unleash/DefaultUnleashTest.java b/src/test/java/io/getunleash/DefaultUnleashTest.java
similarity index 91%
rename from src/test/java/no/finn/unleash/DefaultUnleashTest.java
rename to src/test/java/io/getunleash/DefaultUnleashTest.java
index 21a065d7..ac58d1e0 100644
--- a/src/test/java/no/finn/unleash/DefaultUnleashTest.java
+++ b/src/test/java/io/getunleash/DefaultUnleashTest.java
@@ -1,19 +1,18 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.jupiter.api.Assertions.*;
 import static org.mockito.Mockito.*;
 
+import io.getunleash.event.EventDispatcher;
+import io.getunleash.metric.UnleashMetricService;
+import io.getunleash.repository.ToggleRepository;
+import io.getunleash.strategy.Strategy;
+import io.getunleash.util.UnleashConfig;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import no.finn.unleash.event.EventDispatcher;
-import no.finn.unleash.metric.UnleashMetricService;
-import no.finn.unleash.repository.ToggleRepository;
-import no.finn.unleash.strategy.Strategy;
-import no.finn.unleash.util.UnleashConfig;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/no/finn/unleash/FakeUnleashTest.java b/src/test/java/io/getunleash/FakeUnleashTest.java
similarity index 99%
rename from src/test/java/no/finn/unleash/FakeUnleashTest.java
rename to src/test/java/io/getunleash/FakeUnleashTest.java
index aae65651..0336d4c3 100644
--- a/src/test/java/no/finn/unleash/FakeUnleashTest.java
+++ b/src/test/java/io/getunleash/FakeUnleashTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
diff --git a/src/test/java/no/finn/unleash/ManualTesting.java b/src/test/java/io/getunleash/ManualTesting.java
similarity index 93%
rename from src/test/java/no/finn/unleash/ManualTesting.java
rename to src/test/java/io/getunleash/ManualTesting.java
index 3c87e411..08578eaf 100644
--- a/src/test/java/no/finn/unleash/ManualTesting.java
+++ b/src/test/java/io/getunleash/ManualTesting.java
@@ -1,13 +1,13 @@
-package no.finn.unleash;
-
+package io.getunleash;
+
+import io.getunleash.event.UnleashReady;
+import io.getunleash.event.UnleashSubscriber;
+import io.getunleash.repository.FeatureToggleResponse;
+import io.getunleash.repository.ToggleCollection;
+import io.getunleash.strategy.Strategy;
+import io.getunleash.util.UnleashConfig;
 import java.util.Map;
 import java.util.Random;
-import no.finn.unleash.event.UnleashReady;
-import no.finn.unleash.event.UnleashSubscriber;
-import no.finn.unleash.repository.FeatureToggleResponse;
-import no.finn.unleash.repository.ToggleCollection;
-import no.finn.unleash.strategy.Strategy;
-import no.finn.unleash.util.UnleashConfig;
 
 public class ManualTesting {
     public static void main(String[] args) throws Exception {
diff --git a/src/test/java/no/finn/unleash/ManualVariantTesting.java b/src/test/java/io/getunleash/ManualVariantTesting.java
similarity index 96%
rename from src/test/java/no/finn/unleash/ManualVariantTesting.java
rename to src/test/java/io/getunleash/ManualVariantTesting.java
index 22103b29..2e513bbe 100644
--- a/src/test/java/no/finn/unleash/ManualVariantTesting.java
+++ b/src/test/java/io/getunleash/ManualVariantTesting.java
@@ -1,9 +1,9 @@
-package no.finn.unleash;
+package io.getunleash;
 
+import io.getunleash.strategy.Strategy;
+import io.getunleash.util.UnleashConfig;
 import java.util.Map;
 import java.util.Random;
-import no.finn.unleash.strategy.Strategy;
-import no.finn.unleash.util.UnleashConfig;
 
 public class ManualVariantTesting {
     public static void main(String[] args) throws Exception {
diff --git a/src/test/java/no/finn/unleash/SynchronousTestExecutor.java b/src/test/java/io/getunleash/SynchronousTestExecutor.java
similarity index 95%
rename from src/test/java/no/finn/unleash/SynchronousTestExecutor.java
rename to src/test/java/io/getunleash/SynchronousTestExecutor.java
index c3ae4002..409597ac 100644
--- a/src/test/java/no/finn/unleash/SynchronousTestExecutor.java
+++ b/src/test/java/io/getunleash/SynchronousTestExecutor.java
@@ -1,10 +1,10 @@
-package no.finn.unleash;
+package io.getunleash;
 
+import io.getunleash.util.UnleashScheduledExecutor;
 import java.util.concurrent.Delayed;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-import no.finn.unleash.util.UnleashScheduledExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/test/java/no/finn/unleash/TestUtil.java b/src/test/java/io/getunleash/TestUtil.java
similarity index 96%
rename from src/test/java/no/finn/unleash/TestUtil.java
rename to src/test/java/io/getunleash/TestUtil.java
index dae07878..841ec659 100644
--- a/src/test/java/no/finn/unleash/TestUtil.java
+++ b/src/test/java/io/getunleash/TestUtil.java
@@ -1,4 +1,4 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.LogManager;
diff --git a/src/test/java/no/finn/unleash/UnleashContextTest.java b/src/test/java/io/getunleash/UnleashContextTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/UnleashContextTest.java
rename to src/test/java/io/getunleash/UnleashContextTest.java
index 53b899fa..fa6b9211 100644
--- a/src/test/java/no/finn/unleash/UnleashContextTest.java
+++ b/src/test/java/io/getunleash/UnleashContextTest.java
@@ -1,8 +1,8 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
-import no.finn.unleash.util.UnleashConfig;
+import io.getunleash.util.UnleashConfig;
 import org.junit.jupiter.api.Test;
 
 public class UnleashContextTest {
diff --git a/src/test/java/no/finn/unleash/UnleashTest.java b/src/test/java/io/getunleash/UnleashTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/UnleashTest.java
rename to src/test/java/io/getunleash/UnleashTest.java
index 63c73dc4..2531e1fc 100644
--- a/src/test/java/no/finn/unleash/UnleashTest.java
+++ b/src/test/java/io/getunleash/UnleashTest.java
@@ -1,18 +1,18 @@
-package no.finn.unleash;
+package io.getunleash;
 
 import static java.util.Arrays.asList;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import io.getunleash.repository.ToggleRepository;
+import io.getunleash.strategy.Strategy;
+import io.getunleash.strategy.UserWithIdStrategy;
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.variant.Payload;
+import io.getunleash.variant.VariantDefinition;
 import java.util.*;
 import java.util.function.BiFunction;
-import no.finn.unleash.repository.ToggleRepository;
-import no.finn.unleash.strategy.Strategy;
-import no.finn.unleash.strategy.UserWithIdStrategy;
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.variant.Payload;
-import no.finn.unleash.variant.VariantDefinition;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/no/finn/unleash/event/SubscriberTest.java b/src/test/java/io/getunleash/event/SubscriberTest.java
similarity index 88%
rename from src/test/java/no/finn/unleash/event/SubscriberTest.java
rename to src/test/java/io/getunleash/event/SubscriberTest.java
index a2edf838..27639dbe 100644
--- a/src/test/java/no/finn/unleash/event/SubscriberTest.java
+++ b/src/test/java/io/getunleash/event/SubscriberTest.java
@@ -1,7 +1,7 @@
-package no.finn.unleash.event;
+package io.getunleash.event;
 
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
-import static no.finn.unleash.repository.FeatureToggleResponse.Status.UNAVAILABLE;
+import static io.getunleash.repository.FeatureToggleResponse.Status.*;
 import static org.assertj.core.api.Assertions.assertThat;
 
 import com.github.jenspiegsa.wiremockextension.ConfigureWireMock;
@@ -10,16 +10,16 @@ import com.github.jenspiegsa.wiremockextension.WireMockExtension;
 import com.github.jenspiegsa.wiremockextension.WireMockSettings;
 import com.github.tomakehurst.wiremock.WireMockServer;
 import com.github.tomakehurst.wiremock.core.Options;
+import io.getunleash.DefaultUnleash;
+import io.getunleash.SynchronousTestExecutor;
+import io.getunleash.Unleash;
+import io.getunleash.UnleashException;
+import io.getunleash.metric.ClientMetrics;
+import io.getunleash.metric.ClientRegistration;
+import io.getunleash.repository.FeatureToggleResponse;
+import io.getunleash.util.UnleashConfig;
 import java.util.ArrayList;
 import java.util.List;
-import no.finn.unleash.DefaultUnleash;
-import no.finn.unleash.SynchronousTestExecutor;
-import no.finn.unleash.Unleash;
-import no.finn.unleash.UnleashException;
-import no.finn.unleash.metric.ClientMetrics;
-import no.finn.unleash.metric.ClientRegistration;
-import no.finn.unleash.repository.FeatureToggleResponse;
-import no.finn.unleash.util.UnleashConfig;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
@@ -57,7 +57,8 @@ public class SubscriberTest {
         unleash.isEnabled("myFeature");
 
         assertThat(testSubscriber.togglesFetchedCounter).isEqualTo(2); // one forced, one scheduled
-        assertThat(testSubscriber.status).isEqualTo(UNAVAILABLE);
+        assertThat(testSubscriber.status)
+                .isEqualTo(UNAVAILABLE);
         assertThat(testSubscriber.toggleEvalutatedCounter).isEqualTo(3);
         assertThat(testSubscriber.toggleName).isEqualTo("myFeature");
         assertThat(testSubscriber.toggleEnabled).isFalse();
diff --git a/src/test/java/no/finn/unleash/example/CustomStrategy.java b/src/test/java/io/getunleash/example/CustomStrategy.java
similarity index 77%
rename from src/test/java/no/finn/unleash/example/CustomStrategy.java
rename to src/test/java/io/getunleash/example/CustomStrategy.java
index b81f3a66..70ab62f0 100644
--- a/src/test/java/no/finn/unleash/example/CustomStrategy.java
+++ b/src/test/java/io/getunleash/example/CustomStrategy.java
@@ -1,7 +1,7 @@
-package no.finn.unleash.example;
+package io.getunleash.example;
 
+import io.getunleash.strategy.Strategy;
 import java.util.Map;
-import no.finn.unleash.strategy.Strategy;
 
 final class CustomStrategy implements Strategy {
     @Override
diff --git a/src/test/java/no/finn/unleash/example/UnleashUsageTest.java b/src/test/java/io/getunleash/example/UnleashUsageTest.java
similarity index 80%
rename from src/test/java/no/finn/unleash/example/UnleashUsageTest.java
rename to src/test/java/io/getunleash/example/UnleashUsageTest.java
index 7f7ba8df..69dff473 100644
--- a/src/test/java/no/finn/unleash/example/UnleashUsageTest.java
+++ b/src/test/java/io/getunleash/example/UnleashUsageTest.java
@@ -1,11 +1,11 @@
-package no.finn.unleash.example;
+package io.getunleash.example;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 
-import no.finn.unleash.DefaultUnleash;
-import no.finn.unleash.TestUtil;
-import no.finn.unleash.Unleash;
-import no.finn.unleash.util.UnleashConfig;
+import io.getunleash.DefaultUnleash;
+import io.getunleash.TestUtil;
+import io.getunleash.Unleash;
+import io.getunleash.util.UnleashConfig;
 import org.apache.logging.log4j.Level;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/no/finn/unleash/integration/ClientSpecificationTest.java b/src/test/java/io/getunleash/integration/ClientSpecificationTest.java
similarity index 97%
rename from src/test/java/no/finn/unleash/integration/ClientSpecificationTest.java
rename to src/test/java/io/getunleash/integration/ClientSpecificationTest.java
index 0f21f2bc..bbed913a 100644
--- a/src/test/java/no/finn/unleash/integration/ClientSpecificationTest.java
+++ b/src/test/java/io/getunleash/integration/ClientSpecificationTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.integration;
+package io.getunleash.integration;
 
 import static com.github.tomakehurst.wiremock.client.WireMock.*;
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
@@ -13,6 +13,11 @@ import com.github.tomakehurst.wiremock.WireMockServer;
 import com.github.tomakehurst.wiremock.core.Options;
 import com.google.gson.Gson;
 import com.google.gson.reflect.TypeToken;
+import io.getunleash.DefaultUnleash;
+import io.getunleash.Unleash;
+import io.getunleash.UnleashContext;
+import io.getunleash.Variant;
+import io.getunleash.util.UnleashConfig;
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileWriter;
@@ -26,11 +31,6 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import no.finn.unleash.DefaultUnleash;
-import no.finn.unleash.Unleash;
-import no.finn.unleash.UnleashContext;
-import no.finn.unleash.Variant;
-import no.finn.unleash.util.UnleashConfig;
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
 import org.junit.jupiter.api.extension.ExtendWith;
diff --git a/src/test/java/no/finn/unleash/integration/TestCase.java b/src/test/java/io/getunleash/integration/TestCase.java
similarity index 92%
rename from src/test/java/no/finn/unleash/integration/TestCase.java
rename to src/test/java/io/getunleash/integration/TestCase.java
index 508eebbc..e317e173 100644
--- a/src/test/java/no/finn/unleash/integration/TestCase.java
+++ b/src/test/java/io/getunleash/integration/TestCase.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.integration;
+package io.getunleash.integration;
 
 public class TestCase {
     private String description;
diff --git a/src/test/java/no/finn/unleash/integration/TestCaseVariant.java b/src/test/java/io/getunleash/integration/TestCaseVariant.java
similarity index 89%
rename from src/test/java/no/finn/unleash/integration/TestCaseVariant.java
rename to src/test/java/io/getunleash/integration/TestCaseVariant.java
index fdebd360..bbb7adaa 100644
--- a/src/test/java/no/finn/unleash/integration/TestCaseVariant.java
+++ b/src/test/java/io/getunleash/integration/TestCaseVariant.java
@@ -1,6 +1,6 @@
-package no.finn.unleash.integration;
+package io.getunleash.integration;
 
-import no.finn.unleash.Variant;
+import io.getunleash.Variant;
 
 public class TestCaseVariant {
     private String description;
diff --git a/src/test/java/no/finn/unleash/integration/TestDefinition.java b/src/test/java/io/getunleash/integration/TestDefinition.java
similarity index 93%
rename from src/test/java/no/finn/unleash/integration/TestDefinition.java
rename to src/test/java/io/getunleash/integration/TestDefinition.java
index 35130a98..e73f3912 100644
--- a/src/test/java/no/finn/unleash/integration/TestDefinition.java
+++ b/src/test/java/io/getunleash/integration/TestDefinition.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.integration;
+package io.getunleash.integration;
 
 import com.google.gson.JsonObject;
 import java.util.ArrayList;
diff --git a/src/test/java/no/finn/unleash/integration/UnleashContextDefinition.java b/src/test/java/io/getunleash/integration/UnleashContextDefinition.java
similarity index 97%
rename from src/test/java/no/finn/unleash/integration/UnleashContextDefinition.java
rename to src/test/java/io/getunleash/integration/UnleashContextDefinition.java
index 750f883a..1b8ba4e9 100644
--- a/src/test/java/no/finn/unleash/integration/UnleashContextDefinition.java
+++ b/src/test/java/io/getunleash/integration/UnleashContextDefinition.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.integration;
+package io.getunleash.integration;
 
 import java.util.Map;
 
diff --git a/src/test/java/no/finn/unleash/metric/UnleashMetricServiceImplTest.java b/src/test/java/io/getunleash/metric/UnleashMetricServiceImplTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/metric/UnleashMetricServiceImplTest.java
rename to src/test/java/io/getunleash/metric/UnleashMetricServiceImplTest.java
index 09d8b1f5..811dc6a3 100644
--- a/src/test/java/no/finn/unleash/metric/UnleashMetricServiceImplTest.java
+++ b/src/test/java/io/getunleash/metric/UnleashMetricServiceImplTest.java
@@ -1,12 +1,12 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.*;
 
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.util.UnleashScheduledExecutor;
 import java.util.HashSet;
 import java.util.Set;
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.util.UnleashScheduledExecutor;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
diff --git a/src/test/java/no/finn/unleash/metric/UnleashMetricsSenderTest.java b/src/test/java/io/getunleash/metric/UnleashMetricsSenderTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/metric/UnleashMetricsSenderTest.java
rename to src/test/java/io/getunleash/metric/UnleashMetricsSenderTest.java
index da834aa8..fab57f72 100644
--- a/src/test/java/no/finn/unleash/metric/UnleashMetricsSenderTest.java
+++ b/src/test/java/io/getunleash/metric/UnleashMetricsSenderTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.metric;
+package io.getunleash.metric;
 
 import static com.github.tomakehurst.wiremock.client.WireMock.*;
 import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
@@ -10,11 +10,11 @@ import com.github.jenspiegsa.wiremockextension.WireMockExtension;
 import com.github.jenspiegsa.wiremockextension.WireMockSettings;
 import com.github.tomakehurst.wiremock.WireMockServer;
 import com.github.tomakehurst.wiremock.core.Options;
+import io.getunleash.util.UnleashConfig;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.time.LocalDateTime;
 import java.util.HashSet;
-import no.finn.unleash.util.UnleashConfig;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 
diff --git a/src/test/java/no/finn/unleash/repository/FeatureToggleRepositoryTest.java b/src/test/java/io/getunleash/repository/FeatureToggleRepositoryTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/repository/FeatureToggleRepositoryTest.java
rename to src/test/java/io/getunleash/repository/FeatureToggleRepositoryTest.java
index 9094e2b4..ca5a094d 100644
--- a/src/test/java/no/finn/unleash/repository/FeatureToggleRepositoryTest.java
+++ b/src/test/java/io/getunleash/repository/FeatureToggleRepositoryTest.java
@@ -1,10 +1,14 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.*;
 
+import io.getunleash.ActivationStrategy;
+import io.getunleash.FeatureToggle;
+import io.getunleash.util.UnleashConfig;
+import io.getunleash.util.UnleashScheduledExecutor;
 import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
@@ -14,10 +18,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import no.finn.unleash.ActivationStrategy;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.util.UnleashConfig;
-import no.finn.unleash.util.UnleashScheduledExecutor;
 import org.junit.jupiter.api.Test;
 import org.mockito.ArgumentCaptor;
 
diff --git a/src/test/java/no/finn/unleash/repository/HttpToggleFetcherTest.java b/src/test/java/io/getunleash/repository/HttpToggleFetcherTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/repository/HttpToggleFetcherTest.java
rename to src/test/java/io/getunleash/repository/HttpToggleFetcherTest.java
index 19e3b33b..6c64efed 100644
--- a/src/test/java/no/finn/unleash/repository/HttpToggleFetcherTest.java
+++ b/src/test/java/io/getunleash/repository/HttpToggleFetcherTest.java
@@ -1,8 +1,9 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static com.github.tomakehurst.wiremock.client.WireMock.*;
 import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
 
 import com.github.jenspiegsa.wiremockextension.ConfigureWireMock;
 import com.github.jenspiegsa.wiremockextension.InjectServer;
@@ -10,11 +11,11 @@ import com.github.jenspiegsa.wiremockextension.WireMockExtension;
 import com.github.jenspiegsa.wiremockextension.WireMockSettings;
 import com.github.tomakehurst.wiremock.WireMockServer;
 import com.github.tomakehurst.wiremock.core.Options;
+import io.getunleash.FeatureToggle;
+import io.getunleash.util.UnleashConfig;
 import java.net.HttpURLConnection;
 import java.net.URI;
 import java.net.URISyntaxException;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.util.UnleashConfig;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.params.ParameterizedTest;
@@ -344,7 +345,7 @@ public class HttpToggleFetcherTest {
         String name = "^!#$!$?";
         UnleashConfig config =
                 UnleashConfig.builder().appName("test").unleashAPI(uri).projectName(name).build();
-        org.assertj.core.api.Assertions.assertThatThrownBy(() -> new HttpToggleFetcher(config))
+        assertThatThrownBy(() -> new HttpToggleFetcher(config))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("?project=" + name + "] was not URL friendly.");
     }
diff --git a/src/test/java/no/finn/unleash/repository/JsonFeatureToggleParserTest.java b/src/test/java/io/getunleash/repository/JsonFeatureToggleParserTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/repository/JsonFeatureToggleParserTest.java
rename to src/test/java/io/getunleash/repository/JsonFeatureToggleParserTest.java
index 20238b43..e85b2361 100644
--- a/src/test/java/no/finn/unleash/repository/JsonFeatureToggleParserTest.java
+++ b/src/test/java/io/getunleash/repository/JsonFeatureToggleParserTest.java
@@ -1,10 +1,10 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
+import io.getunleash.FeatureToggle;
 import java.io.*;
-import no.finn.unleash.FeatureToggle;
 import org.junit.jupiter.api.Test;
 
 public class JsonFeatureToggleParserTest {
diff --git a/src/test/java/no/finn/unleash/repository/ToggleBackupHandlerFileTest.java b/src/test/java/io/getunleash/repository/ToggleBackupHandlerFileTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/repository/ToggleBackupHandlerFileTest.java
rename to src/test/java/io/getunleash/repository/ToggleBackupHandlerFileTest.java
index 90fceb32..71f23501 100644
--- a/src/test/java/no/finn/unleash/repository/ToggleBackupHandlerFileTest.java
+++ b/src/test/java/io/getunleash/repository/ToggleBackupHandlerFileTest.java
@@ -1,11 +1,11 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static org.junit.jupiter.api.Assertions.*;
 
+import io.getunleash.TestUtil;
+import io.getunleash.util.UnleashConfig;
 import java.io.*;
 import java.net.URISyntaxException;
-import no.finn.unleash.TestUtil;
-import no.finn.unleash.util.UnleashConfig;
 import org.apache.logging.log4j.Level;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/no/finn/unleash/repository/ToggleBootstrapFileProviderTest.java b/src/test/java/io/getunleash/repository/ToggleBootstrapFileProviderTest.java
similarity index 97%
rename from src/test/java/no/finn/unleash/repository/ToggleBootstrapFileProviderTest.java
rename to src/test/java/io/getunleash/repository/ToggleBootstrapFileProviderTest.java
index 88df3b04..a1c729d7 100644
--- a/src/test/java/no/finn/unleash/repository/ToggleBootstrapFileProviderTest.java
+++ b/src/test/java/io/getunleash/repository/ToggleBootstrapFileProviderTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
diff --git a/src/test/java/no/finn/unleash/repository/ToggleBootstrapHandlerTest.java b/src/test/java/io/getunleash/repository/ToggleBootstrapHandlerTest.java
similarity index 96%
rename from src/test/java/no/finn/unleash/repository/ToggleBootstrapHandlerTest.java
rename to src/test/java/io/getunleash/repository/ToggleBootstrapHandlerTest.java
index 1330d243..5af03c04 100644
--- a/src/test/java/no/finn/unleash/repository/ToggleBootstrapHandlerTest.java
+++ b/src/test/java/io/getunleash/repository/ToggleBootstrapHandlerTest.java
@@ -1,13 +1,13 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
+import io.getunleash.util.UnleashConfig;
 import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
-import no.finn.unleash.util.UnleashConfig;
 import org.junit.jupiter.api.Test;
 
 public class ToggleBootstrapHandlerTest {
diff --git a/src/test/java/no/finn/unleash/repository/UnleashExceptionExtension.java b/src/test/java/io/getunleash/repository/UnleashExceptionExtension.java
similarity index 86%
rename from src/test/java/no/finn/unleash/repository/UnleashExceptionExtension.java
rename to src/test/java/io/getunleash/repository/UnleashExceptionExtension.java
index 00752c21..63138508 100644
--- a/src/test/java/no/finn/unleash/repository/UnleashExceptionExtension.java
+++ b/src/test/java/io/getunleash/repository/UnleashExceptionExtension.java
@@ -1,6 +1,6 @@
-package no.finn.unleash.repository;
+package io.getunleash.repository;
 
-import no.finn.unleash.UnleashException;
+import io.getunleash.UnleashException;
 import org.junit.jupiter.api.extension.ExtensionContext;
 import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
 
diff --git a/src/test/java/no/finn/unleash/strategy/ApplicationHostnameStrategyTest.java b/src/test/java/io/getunleash/strategy/ApplicationHostnameStrategyTest.java
similarity index 99%
rename from src/test/java/no/finn/unleash/strategy/ApplicationHostnameStrategyTest.java
rename to src/test/java/io/getunleash/strategy/ApplicationHostnameStrategyTest.java
index d0a41d1e..66cf7b1d 100644
--- a/src/test/java/no/finn/unleash/strategy/ApplicationHostnameStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/ApplicationHostnameStrategyTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/src/test/java/no/finn/unleash/strategy/FlexibleRolloutStrategyTest.java b/src/test/java/io/getunleash/strategy/FlexibleRolloutStrategyTest.java
similarity index 99%
rename from src/test/java/no/finn/unleash/strategy/FlexibleRolloutStrategyTest.java
rename to src/test/java/io/getunleash/strategy/FlexibleRolloutStrategyTest.java
index 4e48eedb..7d90e98f 100644
--- a/src/test/java/no/finn/unleash/strategy/FlexibleRolloutStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/FlexibleRolloutStrategyTest.java
@@ -1,12 +1,12 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.*;
 
+import io.getunleash.UnleashContext;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.function.Supplier;
-import no.finn.unleash.UnleashContext;
 import org.junit.jupiter.api.Test;
 
 class FlexibleRolloutStrategyTest {
diff --git a/src/test/java/no/finn/unleash/strategy/GradualRolloutRandomStrategyTest.java b/src/test/java/io/getunleash/strategy/GradualRolloutRandomStrategyTest.java
similarity index 99%
rename from src/test/java/no/finn/unleash/strategy/GradualRolloutRandomStrategyTest.java
rename to src/test/java/io/getunleash/strategy/GradualRolloutRandomStrategyTest.java
index 57d42ce4..13b044fb 100644
--- a/src/test/java/no/finn/unleash/strategy/GradualRolloutRandomStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/GradualRolloutRandomStrategyTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/src/test/java/no/finn/unleash/strategy/GradualRolloutSessionIdStrategyTest.java b/src/test/java/io/getunleash/strategy/GradualRolloutSessionIdStrategyTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/strategy/GradualRolloutSessionIdStrategyTest.java
rename to src/test/java/io/getunleash/strategy/GradualRolloutSessionIdStrategyTest.java
index 58211a02..65954a68 100644
--- a/src/test/java/no/finn/unleash/strategy/GradualRolloutSessionIdStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/GradualRolloutSessionIdStrategyTest.java
@@ -1,15 +1,15 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import com.google.common.collect.ImmutableList;
+import io.getunleash.UnleashContext;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import no.finn.unleash.UnleashContext;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
diff --git a/src/test/java/no/finn/unleash/strategy/GradualRolloutUserIdStrategyTest.java b/src/test/java/io/getunleash/strategy/GradualRolloutUserIdStrategyTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/strategy/GradualRolloutUserIdStrategyTest.java
rename to src/test/java/io/getunleash/strategy/GradualRolloutUserIdStrategyTest.java
index 68def2e7..be979079 100644
--- a/src/test/java/no/finn/unleash/strategy/GradualRolloutUserIdStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/GradualRolloutUserIdStrategyTest.java
@@ -1,15 +1,15 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import com.google.common.collect.ImmutableList;
+import io.getunleash.UnleashContext;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
-import no.finn.unleash.UnleashContext;
 import org.assertj.core.data.Offset;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Disabled;
diff --git a/src/test/java/no/finn/unleash/strategy/RemoteAddressStrategyTest.java b/src/test/java/io/getunleash/strategy/RemoteAddressStrategyTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/strategy/RemoteAddressStrategyTest.java
rename to src/test/java/io/getunleash/strategy/RemoteAddressStrategyTest.java
index f77ee726..f391ca23 100644
--- a/src/test/java/no/finn/unleash/strategy/RemoteAddressStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/RemoteAddressStrategyTest.java
@@ -1,15 +1,15 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
 import com.google.common.collect.ImmutableList;
+import io.getunleash.UnleashContext;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Stream;
-import no.finn.unleash.UnleashContext;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
diff --git a/src/test/java/no/finn/unleash/strategy/StrategyTest.java b/src/test/java/io/getunleash/strategy/StrategyTest.java
similarity index 97%
rename from src/test/java/no/finn/unleash/strategy/StrategyTest.java
rename to src/test/java/io/getunleash/strategy/StrategyTest.java
index c346e5a2..971654b2 100644
--- a/src/test/java/no/finn/unleash/strategy/StrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/StrategyTest.java
@@ -1,15 +1,15 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.junit.jupiter.api.Assertions.*;
 
+import io.getunleash.Constraint;
+import io.getunleash.Operator;
+import io.getunleash.UnleashContext;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import no.finn.unleash.Constraint;
-import no.finn.unleash.Operator;
-import no.finn.unleash.UnleashContext;
 import org.junit.jupiter.api.Test;
 
 class StrategyTest {
diff --git a/src/test/java/no/finn/unleash/strategy/StrategyUsingContext.java b/src/test/java/io/getunleash/strategy/StrategyUsingContext.java
similarity index 91%
rename from src/test/java/no/finn/unleash/strategy/StrategyUsingContext.java
rename to src/test/java/io/getunleash/strategy/StrategyUsingContext.java
index 974f6c4f..2c9a0138 100644
--- a/src/test/java/no/finn/unleash/strategy/StrategyUsingContext.java
+++ b/src/test/java/io/getunleash/strategy/StrategyUsingContext.java
@@ -1,10 +1,10 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static java.util.Arrays.asList;
 
+import io.getunleash.UnleashContext;
 import java.util.List;
 import java.util.Map;
-import no.finn.unleash.UnleashContext;
 
 public class StrategyUsingContext implements Strategy {
 
diff --git a/src/test/java/no/finn/unleash/strategy/StrategyUtilsTest.java b/src/test/java/io/getunleash/strategy/StrategyUtilsTest.java
similarity index 91%
rename from src/test/java/no/finn/unleash/strategy/StrategyUtilsTest.java
rename to src/test/java/io/getunleash/strategy/StrategyUtilsTest.java
index 6d37e59b..6c01f2ac 100644
--- a/src/test/java/no/finn/unleash/strategy/StrategyUtilsTest.java
+++ b/src/test/java/io/getunleash/strategy/StrategyUtilsTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
diff --git a/src/test/java/no/finn/unleash/strategy/StrategyWithContextTest.java b/src/test/java/io/getunleash/strategy/StrategyWithContextTest.java
similarity index 93%
rename from src/test/java/no/finn/unleash/strategy/StrategyWithContextTest.java
rename to src/test/java/io/getunleash/strategy/StrategyWithContextTest.java
index a69df882..5cf9f242 100644
--- a/src/test/java/no/finn/unleash/strategy/StrategyWithContextTest.java
+++ b/src/test/java/io/getunleash/strategy/StrategyWithContextTest.java
@@ -1,11 +1,11 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import io.getunleash.UnleashContext;
 import java.util.HashMap;
 import java.util.Map;
-import no.finn.unleash.UnleashContext;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/no/finn/unleash/strategy/UserWithIdStrategyTest.java b/src/test/java/io/getunleash/strategy/UserWithIdStrategyTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/strategy/UserWithIdStrategyTest.java
rename to src/test/java/io/getunleash/strategy/UserWithIdStrategyTest.java
index 9aea66f1..edbe30ef 100644
--- a/src/test/java/no/finn/unleash/strategy/UserWithIdStrategyTest.java
+++ b/src/test/java/io/getunleash/strategy/UserWithIdStrategyTest.java
@@ -1,12 +1,12 @@
-package no.finn.unleash.strategy;
+package io.getunleash.strategy;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import io.getunleash.UnleashContext;
 import java.util.HashMap;
 import java.util.Map;
-import no.finn.unleash.UnleashContext;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git a/src/test/java/no/finn/unleash/util/IpAddressMatcherTest.java b/src/test/java/io/getunleash/util/IpAddressMatcherTest.java
similarity index 99%
rename from src/test/java/no/finn/unleash/util/IpAddressMatcherTest.java
rename to src/test/java/io/getunleash/util/IpAddressMatcherTest.java
index 3c1c2246..f9d48f37 100644
--- a/src/test/java/no/finn/unleash/util/IpAddressMatcherTest.java
+++ b/src/test/java/io/getunleash/util/IpAddressMatcherTest.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package no.finn.unleash.util;
+package io.getunleash.util;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
diff --git a/src/test/java/no/finn/unleash/util/UnleashConfigTest.java b/src/test/java/io/getunleash/util/UnleashConfigTest.java
similarity index 94%
rename from src/test/java/no/finn/unleash/util/UnleashConfigTest.java
rename to src/test/java/io/getunleash/util/UnleashConfigTest.java
index cece9624..69d3b384 100644
--- a/src/test/java/no/finn/unleash/util/UnleashConfigTest.java
+++ b/src/test/java/io/getunleash/util/UnleashConfigTest.java
@@ -1,11 +1,13 @@
-package no.finn.unleash.util;
+package io.getunleash.util;
 
-import static no.finn.unleash.util.UnleashConfig.UNLEASH_APP_NAME_HEADER;
-import static no.finn.unleash.util.UnleashConfig.UNLEASH_INSTANCE_ID_HEADER;
+import static io.getunleash.util.UnleashConfig.UNLEASH_APP_NAME_HEADER;
+import static io.getunleash.util.UnleashConfig.UNLEASH_INSTANCE_ID_HEADER;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.when;
 
+import io.getunleash.CustomHttpHeadersProvider;
+import io.getunleash.DefaultCustomHttpHeadersProviderImpl;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
@@ -13,10 +15,6 @@ import java.net.*;
 import java.net.Authenticator.RequestorType;
 import java.util.HashMap;
 import java.util.Map;
-import no.finn.unleash.CustomHttpHeadersProvider;
-import no.finn.unleash.DefaultCustomHttpHeadersProviderImpl;
-import no.finn.unleash.util.UnleashConfig.CustomProxyAuthenticator;
-import no.finn.unleash.util.UnleashConfig.SystemProxyAuthenticator;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.function.Executable;
 import org.mockito.Mockito;
@@ -128,8 +126,10 @@ public class UnleashConfigTest {
         HttpURLConnection connection = (HttpURLConnection) someUrl.openConnection();
 
         UnleashConfig.setRequestProperties(connection, unleashConfig);
-        assertThat(connection.getRequestProperty(UNLEASH_APP_NAME_HEADER)).isEqualTo(appName);
-        assertThat(connection.getRequestProperty(UNLEASH_INSTANCE_ID_HEADER)).isEqualTo(instanceId);
+        assertThat(connection.getRequestProperty(UNLEASH_APP_NAME_HEADER))
+                .isEqualTo(appName);
+        assertThat(connection.getRequestProperty(UNLEASH_INSTANCE_ID_HEADER))
+                .isEqualTo(instanceId);
         assertThat(connection.getRequestProperty("User-Agent")).isEqualTo(appName);
     }
 
@@ -223,8 +223,8 @@ public class UnleashConfigTest {
 
         Field authenticator = Authenticator.class.getDeclaredField("theAuthenticator");
         authenticator.setAccessible(true);
-        SystemProxyAuthenticator proxyAuthenticator =
-                (SystemProxyAuthenticator) authenticator.get(null);
+        UnleashConfig.SystemProxyAuthenticator proxyAuthenticator =
+                (UnleashConfig.SystemProxyAuthenticator) authenticator.get(null);
 
         Field requestingAuthType =
                 proxyAuthenticator
@@ -282,8 +282,8 @@ public class UnleashConfigTest {
 
         Field authenticator = Authenticator.class.getDeclaredField("theAuthenticator");
         authenticator.setAccessible(true);
-        CustomProxyAuthenticator proxyAuthenticator =
-                (CustomProxyAuthenticator) authenticator.get(null);
+        UnleashConfig.CustomProxyAuthenticator proxyAuthenticator =
+                (UnleashConfig.CustomProxyAuthenticator) authenticator.get(null);
 
         Field requestingAuthType =
                 proxyAuthenticator
diff --git a/src/test/java/no/finn/unleash/util/UnleashScheduledExecutorImplTest.java b/src/test/java/io/getunleash/util/UnleashScheduledExecutorImplTest.java
similarity index 97%
rename from src/test/java/no/finn/unleash/util/UnleashScheduledExecutorImplTest.java
rename to src/test/java/io/getunleash/util/UnleashScheduledExecutorImplTest.java
index 94bc6cbd..58dd3f98 100644
--- a/src/test/java/no/finn/unleash/util/UnleashScheduledExecutorImplTest.java
+++ b/src/test/java/io/getunleash/util/UnleashScheduledExecutorImplTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.util;
+package io.getunleash.util;
 
 import static org.assertj.core.api.Assertions.assertThat;
 
diff --git a/src/test/java/no/finn/unleash/util/UnleashURLsTest.java b/src/test/java/io/getunleash/util/UnleashURLsTest.java
similarity index 98%
rename from src/test/java/no/finn/unleash/util/UnleashURLsTest.java
rename to src/test/java/io/getunleash/util/UnleashURLsTest.java
index 0b524818..6d5fd799 100644
--- a/src/test/java/no/finn/unleash/util/UnleashURLsTest.java
+++ b/src/test/java/io/getunleash/util/UnleashURLsTest.java
@@ -1,4 +1,4 @@
-package no.finn.unleash.util;
+package io.getunleash.util;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git a/src/test/java/no/finn/unleash/variant/VariantUtilTest.java b/src/test/java/io/getunleash/variant/VariantUtilTest.java
similarity index 96%
rename from src/test/java/no/finn/unleash/variant/VariantUtilTest.java
rename to src/test/java/io/getunleash/variant/VariantUtilTest.java
index 596cf896..75d8968d 100644
--- a/src/test/java/no/finn/unleash/variant/VariantUtilTest.java
+++ b/src/test/java/io/getunleash/variant/VariantUtilTest.java
@@ -1,18 +1,18 @@
-package no.finn.unleash.variant;
+package io.getunleash.variant;
 
+import static io.getunleash.Variant.DISABLED_VARIANT;
 import static java.util.Arrays.asList;
-import static no.finn.unleash.Variant.DISABLED_VARIANT;
 import static org.assertj.core.api.Assertions.assertThat;
 
+import io.getunleash.ActivationStrategy;
+import io.getunleash.FeatureToggle;
+import io.getunleash.UnleashContext;
+import io.getunleash.Variant;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
-import no.finn.unleash.ActivationStrategy;
-import no.finn.unleash.FeatureToggle;
-import no.finn.unleash.UnleashContext;
-import no.finn.unleash.Variant;
 import org.junit.jupiter.api.Test;
 
 public class VariantUtilTest {
@@ -201,6 +201,6 @@ public class VariantUtilTest {
         assertThat(variantResults)
                 .allSatisfy(
                         (name, variantResult) ->
-                                assertThat(variantResult).hasSizeBetween(2400, 2600));
+                                assertThat(variantResult).hasSizeBetween(2300, 2700));
     }
 }