You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/07/11 07:02:59 UTC

[isis] branch v2 updated: ISIS-2151 remove dependency on guava

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch v2
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/v2 by this push:
     new b147834  ISIS-2151 remove dependency on guava
b147834 is described below

commit b147834d11a71f1ffcea3997342b500aa92932db
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jul 11 09:02:51 2019 +0200

    ISIS-2151 remove dependency on guava
---
 .../commons/internal/collections/_Multimaps.java   |  31 +-
 .../permission/ApplicationPermissionValueSet.java  |  20 +-
 ...PermissionsEvaluationServiceVetoBeatsAllow.java |   4 +-
 extensions/secman/encryption-jbcrypt/pom.xml       |   1 +
 .../extensions/secman/jdo/TransitionHelper.java    |   9 +-
 .../app/feature/ApplicationFeatureViewModel.java   | 687 +++++++++++----------
 .../app/feature/ApplicationFeatureViewModels.java  |  18 +-
 .../user/ApplicationUser_filterPermissions.java    |  34 +-
 .../jdo/app/user/ApplicationUser_permissions.java  |  19 +-
 .../jdo/app/user/UserPermissionViewModel.java      |  41 +-
 .../jdo/dom/permission/ApplicationPermission.java  |  24 +-
 .../ApplicationPermissionRepository.java           |  71 +--
 .../secman/jdo/dom/role/ApplicationRole.java       |  28 +-
 .../jdo/dom/role/ApplicationRoleRepository.java    |   7 +-
 .../secman/jdo/dom/tenancy/ApplicationTenancy.java |  56 +-
 .../dom/tenancy/ApplicationTenancyRepository.java  |  25 +-
 .../secman/jdo/dom/user/ApplicationUser.java       |  43 +-
 .../jdo/dom/user/ApplicationUserRepository.java    |  33 +-
 .../facets/TenantedAuthorizationFacetFactory.java  |  39 +-
 .../AbstractRoleAndPermissionsFixtureScript.java   |  38 +-
 .../scripts/AbstractUserAndRolesFixtureScript.java |   5 +-
 extensions/secman/pom.xml                          |   9 -
 22 files changed, 575 insertions(+), 667 deletions(-)

diff --git a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java
index 36d6d43..a68ff0d 100644
--- a/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java
+++ b/core/commons/src/main/java/org/apache/isis/commons/internal/collections/_Multimaps.java
@@ -23,14 +23,23 @@ import static org.apache.isis.commons.internal.base._With.requires;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.SortedMap;
+import java.util.SortedSet;
+import java.util.TreeMap;
+import java.util.TreeSet;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Supplier;
 
+import javax.annotation.Nullable;
+
+import org.apache.isis.commons.internal.base._Casts;
+
 /**
  * <h1>- internal use only -</h1>
  * <p>
@@ -133,15 +142,15 @@ public class _Multimaps {
         };
     }
 
-    public static <K, V> SetMultimap<K, V> newSetMultimap(
-            final Supplier<Map<K, Set<V>>> mapFactory,
-            final Supplier<Set<V>> elementCollectionFactory){
+    public static <K, V, S extends Set<V>> SetMultimap<K, V> newSetMultimap(
+            final Supplier<? extends Map<K, S>> mapFactory,
+            final Supplier<S> elementCollectionFactory){
         requires(mapFactory, "mapFactory");
         requires(elementCollectionFactory, "elementCollectionFactory");
 
         return new SetMultimap<K, V>() {
 
-            final Map<K, Set<V>> delegate = mapFactory.get();
+            final Map<K, Set<V>> delegate = _Casts.uncheckedCast(mapFactory.get());
 
             @Override public int size() { return delegate.size(); }
             @Override public boolean isEmpty() { return delegate.isEmpty();	}
@@ -220,6 +229,20 @@ public class _Multimaps {
     }
 
     /**
+     * @param keyComparator - if {@code null} uses natural ordering
+     * @param elementComparator - if {@code null} uses natural ordering
+     * @return TreeMap of TreeSets
+     */
+    public static <K, V> SetMultimap<K, V> newSortedSetMultimap(
+    		@Nullable Comparator<K> keyComparator, 
+    		@Nullable Comparator<V> elementComparator){
+    	
+        final Supplier<SortedMap<K, SortedSet<V>>> mapFactory = ()->new TreeMap<K, SortedSet<V>>(keyComparator);
+        final Supplier<SortedSet<V>> elementSetFactory = ()->new TreeSet<V>(elementComparator);
+		return newSetMultimap(mapFactory, elementSetFactory);
+    }
+    
+    /**
      * @return HashMap of HashMaps
      */
     public static <K1, K2, V> MapMultimap<K1, K2, V> newMapMultimap(){
diff --git a/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java b/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
index 4b12a12..a9cae93 100644
--- a/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
+++ b/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/ApplicationPermissionValueSet.java
@@ -25,13 +25,11 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Programmatic;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimap;
-import com.google.common.collect.TreeMultimap;
-
 /**
  * A serializable value object representing a set of (anonymized) 
  * {@link ApplicationPermissionValue permission}s.
@@ -90,9 +88,11 @@ public class ApplicationPermissionValueSet implements Serializable {
      *     meaning that it is checked first and therefore also takes precedence.
      * </p>
      */
-    private final Multimap<ApplicationFeatureId, ApplicationPermissionValue> permissionsByFeature = TreeMultimap.create(
-            Collections.reverseOrder(ApplicationFeatureId.Comparators.natural()),
-            ApplicationPermissionValue.Comparators.natural());
+    private final _Multimaps.SetMultimap<ApplicationFeatureId, ApplicationPermissionValue> permissionsByFeature = 
+    		_Multimaps.newSortedSetMultimap(
+    				Collections.reverseOrder(ApplicationFeatureId.Comparators.natural()),
+    				null // natural element order
+    				);
 
     /**
      * Note that we require PermissionsEvaluationService to be serializable.
@@ -100,8 +100,6 @@ public class ApplicationPermissionValueSet implements Serializable {
     private final PermissionsEvaluationService permissionsEvaluationService;
 
 
-    
-
     // -- constructor
     ApplicationPermissionValueSet(final ApplicationPermissionValue... permissionValues) {
         this(Arrays.asList(permissionValues));
@@ -110,10 +108,10 @@ public class ApplicationPermissionValueSet implements Serializable {
         this(permissionValues, null);
     }
     public ApplicationPermissionValueSet(final Iterable<ApplicationPermissionValue> permissionValues, final PermissionsEvaluationService permissionsEvaluationService) {
-        this.values = Collections.unmodifiableList(Lists.newArrayList(permissionValues));
+        this.values = Collections.unmodifiableList(_Lists.newArrayList(permissionValues));
         for (final ApplicationPermissionValue permissionValue : permissionValues) {
             final ApplicationFeatureId featureId = permissionValue.getFeatureId();
-            permissionsByFeature.put(featureId, permissionValue);
+            permissionsByFeature.putElement(featureId, permissionValue);
         }
         this.permissionsEvaluationService =
                 permissionsEvaluationService != null
diff --git a/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceVetoBeatsAllow.java b/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceVetoBeatsAllow.java
index b935fb7..f22cf5e 100644
--- a/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceVetoBeatsAllow.java
+++ b/extensions/secman/api/src/main/java/org/apache/isis/extensions/secman/api/permission/PermissionsEvaluationServiceVetoBeatsAllow.java
@@ -22,7 +22,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
-import com.google.common.collect.Lists;
+import org.apache.isis.commons.internal.collections._Lists;
 
 /**
  * An implementation whereby a VETO permission for a feature overrides an ALLOW (for same scope).
@@ -44,7 +44,7 @@ public class PermissionsEvaluationServiceVetoBeatsAllow extends PermissionsEvalu
      */
     @Override
     protected Iterable<ApplicationPermissionValue> ordered(final Collection<ApplicationPermissionValue> permissionValues) {
-        final ArrayList<ApplicationPermissionValue> reversed = Lists.newArrayList(permissionValues);
+        final ArrayList<ApplicationPermissionValue> reversed = _Lists.newArrayList(permissionValues);
         Collections.reverse(reversed);
         return reversed;
     }
diff --git a/extensions/secman/encryption-jbcrypt/pom.xml b/extensions/secman/encryption-jbcrypt/pom.xml
index 966bb01..d0bec69 100644
--- a/extensions/secman/encryption-jbcrypt/pom.xml
+++ b/extensions/secman/encryption-jbcrypt/pom.xml
@@ -35,6 +35,7 @@
         <jar-plugin.automaticModuleName>org.apache.isis.extensions.secman-encryption-jbcrypt</jar-plugin.automaticModuleName>
         <git-plugin.propertiesDir>org/apache/isis/extensions/secman-encryption-jbcrypt</git-plugin.propertiesDir>
         
+        <jbcrypt.version>0.4</jbcrypt.version>
     </properties>
 
     <dependencies>
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/TransitionHelper.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/TransitionHelper.java
index 0e21260..7190c97 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/TransitionHelper.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/TransitionHelper.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.extensions.secman.jdo;
 
+import java.util.stream.Collectors;
+
 import javax.inject.Inject;
 
 import org.apache.isis.applib.ViewModel;
@@ -25,6 +27,7 @@ import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.commons.exceptions.IsisException;
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.metamodel.facets.object.viewmodel.ViewModelFacet;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureType;
@@ -32,8 +35,6 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.context.IsisContext;
 
-import com.google.common.base.Joiner;
-
 @DomainService(nature=NatureOfService.DOMAIN)
 public class TransitionHelper {
 	
@@ -50,7 +51,9 @@ public class TransitionHelper {
 	
 	public static String join(Object ... args) {
 		try {
-			return Joiner.on(":").join(args);			
+			return _NullSafe.stream(args)
+			.map(arg->""+arg)
+			.collect(Collectors.joining(":"));
 		} catch (Exception e) {
 			debug(args);
 			throw e;
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModel.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModel.java
index 811119d..473a6f3 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModel.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModel.java
@@ -20,10 +20,7 @@ package org.apache.isis.extensions.secman.jdo.app.feature;
 
 import java.util.List;
 import java.util.SortedSet;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import java.util.function.Function;
 
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.Collection;
@@ -35,6 +32,8 @@ import org.apache.isis.applib.annotation.PropertyLayout;
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.commons.internal.base._Casts;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.jdo.TransitionHelper;
 import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission;
@@ -44,6 +43,8 @@ import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureType;
 
+import lombok.val;
+
 /**
  * View model identified by {@link ApplicationFeatureId} and backed by an {@link ApplicationFeature}.
  */
@@ -54,344 +55,344 @@ import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureType;
 //)
 public abstract class ApplicationFeatureViewModel implements ViewModel {
 
-    public static abstract class PropertyDomainEvent<S extends ApplicationFeatureViewModel,T> extends SecurityModule.PropertyDomainEvent<S, T> {}
-
-    public static abstract class CollectionDomainEvent<S extends ApplicationFeatureViewModel,T> extends SecurityModule.CollectionDomainEvent<S, T> {}
-
-    public static abstract class ActionDomainEvent<S extends ApplicationFeatureViewModel> extends SecurityModule.ActionDomainEvent<S> {}
-
-    
-
-    // -- constructors
-    public static ApplicationFeatureViewModel newViewModel(
-            final ApplicationFeatureId featureId,
-            final ApplicationFeatureRepositoryDefault applicationFeatureRepository,
-            final TransitionHelper transitionHelper) {
-        final Class<? extends ApplicationFeatureViewModel> cls = viewModelClassFor(featureId, applicationFeatureRepository);
-        return transitionHelper.newViewModelInstance(cls, featureId.asEncodedString());
-    }
-
-    private static Class<? extends ApplicationFeatureViewModel> viewModelClassFor(
-            final ApplicationFeatureId featureId,
-            final ApplicationFeatureRepositoryDefault applicationFeatureRepository) {
-        switch (featureId.getType()) {
-            case PACKAGE:
-                return ApplicationPackage.class;
-            case CLASS:
-                return ApplicationClass.class;
-            case MEMBER:
-            final ApplicationFeature feature = applicationFeatureRepository.findFeature(featureId);
-            
-                if(feature == null) {
-                    // TODO: not sure why, yet...
-                    return null;
-                }
-                switch(feature.getMemberType()) {
-                    case PROPERTY:
-                        return ApplicationClassProperty.class;
-                    case COLLECTION:
-                        return ApplicationClassCollection.class;
-                    case ACTION:
-                        return ApplicationClassAction.class;
-                }
-        }
-        throw new IllegalArgumentException("could not determine feature type; featureId = " + featureId);
-    }
-
-    public ApplicationFeatureViewModel() {
-    	this(TransitionHelper.defaultFeatureId());
-    }
-
-    ApplicationFeatureViewModel(final ApplicationFeatureId featureId) {
-        setFeatureId(featureId);
-    }
-    
-
-    // -- identification
-    /**
-     * having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use
-     * wrapperFactory#unwrap(...) method, which is otherwise broken in Isis 1.6.0
-     */
-    public String title() {
-        return getFullyQualifiedName();
-    }
-    public String iconName() {
-        return "applicationFeature";
-    }
-    
-
-    
-
-    // -- ViewModel impl
-    @Override
-    public String viewModelMemento() {
-        return getFeatureId().asEncodedString();
-    }
-
-    @Override
-    public void viewModelInit(final String encodedMemento) {
-        final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.parseEncoded(encodedMemento);
-        setFeatureId(applicationFeatureId);
-    }
-
-    
-
-    
-
-    // -- featureId (property, programmatic)
-    private ApplicationFeatureId featureId;
-
-    @Programmatic
-    public ApplicationFeatureId getFeatureId() {
-        return featureId;
-    }
-
-    public void setFeatureId(final ApplicationFeatureId applicationFeatureId) {
-        this.featureId = applicationFeatureId;
-    }
-    
-
-    // -- feature (property, programmatic)
-    @Programmatic
-    ApplicationFeature getFeature() {
-        return applicationFeatureRepository.findFeature(getFeatureId());
-    }
-    
-    
-    // -- fullyQualifiedName (property, programmatic)
-    @Programmatic // in the title
-    public String getFullyQualifiedName() {
-        return getFeatureId().getFullyQualifiedName();
-    }
-    
-
-    
-
-    // -- type (programmatic)
-    @Programmatic
-    public ApplicationFeatureType getType() {
-        return getFeatureId().getType();
-    }
-    
-
-    
-
-    // -- packageName
-    public static class PackageNameDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, String> {}
-
-    @Property(
-            domainEvent = PackageNameDomainEvent.class
-    )
-    @PropertyLayout(typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
-    @MemberOrder(name="Id", sequence = "2.2")
-    public String getPackageName() {
-        return getFeatureId().getPackageName();
-    }
-
-    
-
-    
-
-    // -- className
-
-    public static class ClassNameDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, String> {}
-
-    /**
-     * For packages, will be null. Is in this class (rather than subclasses) so is shown in
-     * {@link ApplicationPackage#getContents() package contents}.
-     */
-    @Property(
-            domainEvent = ClassNameDomainEvent.class
-    )
-    @PropertyLayout(typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
-    @MemberOrder(name="Id", sequence = "2.3")
-    public String getClassName() {
-        return getFeatureId().getClassName();
-    }
-    public boolean hideClassName() {
-        return getType().hideClassName();
-    }
-
-    
-
-    
-
-    // -- memberName
-
-    public static class MemberNameDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, String> {}
-
-    /**
-     * For packages and class names, will be null.
-     */
-    @Property(
-            domainEvent = MemberNameDomainEvent.class
-    )
-    @PropertyLayout(typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
-    @MemberOrder(name="Id", sequence = "2.4")
-    public String getMemberName() {
-        return getFeatureId().getMemberName();
-    }
-
-    public boolean hideMemberName() {
-        return getType().hideMember();
-    }
-
-
-    
-
-    
-
-    // -- parent (property)
-
-    public static class ParentDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, ApplicationFeatureViewModel> {}
-
-    @Property(
-            domainEvent = ParentDomainEvent.class
-    )
-    @PropertyLayout(hidden=Where.ALL_TABLES)
-    @MemberOrder(name = "Parent", sequence = "2.6")
-    public ApplicationFeatureViewModel getParent() {
-        final ApplicationFeatureId parentId;
-        parentId = getType() == ApplicationFeatureType.MEMBER
-                ? getFeatureId().getParentClassId()
-                : getFeatureId().getParentPackageId();
-        if(parentId == null) {
-            return null;
-        }
-        final ApplicationFeature feature = applicationFeatureRepository.findFeature(parentId);
-        if (feature == null) {
-            return null;
-        }
-        final Class<? extends ApplicationFeatureViewModel> cls = 
-        		viewModelClassFor(parentId, applicationFeatureRepository);
-        return transitionHelper
-        		.newViewModelInstance(cls, parentId.asEncodedString());
-
-    }
-    
-
-    
-
-    // -- contributed (property)
-
-    public static class ContributedDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, Boolean> {}
-
-    /**
-     * For packages and class names, will be null.
-     */
-    @Property(
-            domainEvent = ContributedDomainEvent.class
-    )
-    @MemberOrder(name="Contributed", sequence = "2.5.5")
-    public boolean isContributed() {
-        return getFeature().isContributed();
-    }
-
-    public boolean hideContributed() {
-        return getType().hideMember();
-    }
-    
-
-    
-
-    // -- permissions (collection)
-    public static class PermissionsDomainEvent extends CollectionDomainEvent<ApplicationFeatureViewModel, ApplicationPermission> {}
-
-    @Collection(
-            domainEvent = PermissionsDomainEvent.class
-    )
-    @CollectionLayout(
-            defaultView="table"
-    )
-    @MemberOrder(sequence = "10")
-    public List<ApplicationPermission> getPermissions() {
-        return applicationPermissionRepository.findByFeatureCached(getFeatureId());
-    }
-    
-
-    
-
-    // -- parentPackage (property, programmatic, for packages & classes only)
-
-    /**
-     * The parent package feature of this class or package.
-     */
-    @Programmatic
-    public ApplicationFeatureViewModel getParentPackage() {
-        return Functions.asViewModelForId(applicationFeatureRepository, transitionHelper).apply(getFeatureId().getParentPackageId());
-    }
-    
-
-    
-
-    // -- equals, hashCode, toString
-
-    private final static String propertyNames = "featureId";
-
-    @Override
-    public boolean equals(final Object obj) {
-        return ObjectContracts.equals(this, obj, propertyNames);
-    }
-
-    @Override
-    public int hashCode() {
-        return ObjectContracts.hashCode(this, propertyNames);
-    }
-
-    @Override
-    public String toString() {
-        return ObjectContracts.toString(this, propertyNames);
-    }
-    
-
-    // -- helpers
-    <T extends ApplicationFeatureViewModel> List<T> asViewModels(final SortedSet<ApplicationFeatureId> members) {
-        final Function<ApplicationFeatureId, T> function = Functions.<T>asViewModelForId(applicationFeatureRepository, transitionHelper);
-        return Lists.newArrayList(
-                Iterables.transform(members, function));
-    }
-    
-
-    // -- Functions
-
-    public static class Functions {
-        private Functions(){}
-        public static <T extends ApplicationFeatureViewModel> Function<ApplicationFeatureId, T> asViewModelForId(
-                final ApplicationFeatureRepositoryDefault applicationFeatureRepository, final TransitionHelper transitionHelper) {
-            return new Function<ApplicationFeatureId, T>(){
-                @Override
-                public T apply(final ApplicationFeatureId input) {
-                    return (T)ApplicationFeatureViewModel.newViewModel(input, applicationFeatureRepository, transitionHelper);
-                }
-            };
-        }
-        public static <T extends ApplicationFeatureViewModel> Function<ApplicationFeature, T> asViewModel(
-                final ApplicationFeatureRepositoryDefault applicationFeatureRepository, final TransitionHelper transitionHelper) {
-            return new Function<ApplicationFeature, T>(){
-                @Override
-                public T apply(final ApplicationFeature input) {
-                    return (T) ApplicationFeatureViewModel.newViewModel(input.getFeatureId(), applicationFeatureRepository, transitionHelper);
-                }
-            };
-        }
-    }
-    
-    
-
-
-    // -- injected services
-    @javax.inject.Inject
-    RepositoryService repository;
-    
-    @javax.inject.Inject
-    ApplicationFeatureRepositoryDefault applicationFeatureRepository;
-
-    @javax.inject.Inject
-    ApplicationPermissionRepository applicationPermissionRepository;
-
-    @javax.inject.Inject
-    TransitionHelper transitionHelper;
-    
-    
+	public static abstract class PropertyDomainEvent<S extends ApplicationFeatureViewModel,T> extends SecurityModule.PropertyDomainEvent<S, T> {
+		private static final long serialVersionUID = 1L;}
+
+	public static abstract class CollectionDomainEvent<S extends ApplicationFeatureViewModel,T> extends SecurityModule.CollectionDomainEvent<S, T> {
+		private static final long serialVersionUID = 1L;}
+
+	public static abstract class ActionDomainEvent<S extends ApplicationFeatureViewModel> extends SecurityModule.ActionDomainEvent<S> {
+		private static final long serialVersionUID = 1L;}
+
+
+
+	// -- constructors
+	public static ApplicationFeatureViewModel newViewModel(
+			final ApplicationFeatureId featureId,
+			final ApplicationFeatureRepositoryDefault applicationFeatureRepository,
+			final TransitionHelper transitionHelper) {
+		final Class<? extends ApplicationFeatureViewModel> cls = viewModelClassFor(featureId, applicationFeatureRepository);
+		return transitionHelper.newViewModelInstance(cls, featureId.asEncodedString());
+	}
+
+	private static Class<? extends ApplicationFeatureViewModel> viewModelClassFor(
+			final ApplicationFeatureId featureId,
+			final ApplicationFeatureRepositoryDefault applicationFeatureRepository) {
+		switch (featureId.getType()) {
+		case PACKAGE:
+			return ApplicationPackage.class;
+		case CLASS:
+			return ApplicationClass.class;
+		case MEMBER:
+			final ApplicationFeature feature = applicationFeatureRepository.findFeature(featureId);
+
+			if(feature == null) {
+				// TODO: not sure why, yet...
+				return null;
+			}
+			switch(feature.getMemberType()) {
+			case PROPERTY:
+				return ApplicationClassProperty.class;
+			case COLLECTION:
+				return ApplicationClassCollection.class;
+			case ACTION:
+				return ApplicationClassAction.class;
+			}
+		}
+		throw new IllegalArgumentException("could not determine feature type; featureId = " + featureId);
+	}
+
+	public ApplicationFeatureViewModel() {
+		this(TransitionHelper.defaultFeatureId());
+	}
+
+	ApplicationFeatureViewModel(final ApplicationFeatureId featureId) {
+		setFeatureId(featureId);
+	}
+
+
+	// -- identification
+	/**
+	 * having a title() method (rather than using @Title annotation) is necessary as a workaround to be able to use
+	 * wrapperFactory#unwrap(...) method, which is otherwise broken in Isis 1.6.0
+	 */
+	public String title() {
+		return getFullyQualifiedName();
+	}
+	public String iconName() {
+		return "applicationFeature";
+	}
+
+
+
+
+	// -- ViewModel impl
+	@Override
+	public String viewModelMemento() {
+		return getFeatureId().asEncodedString();
+	}
+
+	@Override
+	public void viewModelInit(final String encodedMemento) {
+		final ApplicationFeatureId applicationFeatureId = ApplicationFeatureId.parseEncoded(encodedMemento);
+		setFeatureId(applicationFeatureId);
+	}
+
+
+
+
+
+	// -- featureId (property, programmatic)
+	private ApplicationFeatureId featureId;
+
+	@Programmatic
+	public ApplicationFeatureId getFeatureId() {
+		return featureId;
+	}
+
+	public void setFeatureId(final ApplicationFeatureId applicationFeatureId) {
+		this.featureId = applicationFeatureId;
+	}
+
+
+	// -- feature (property, programmatic)
+	@Programmatic
+	ApplicationFeature getFeature() {
+		return applicationFeatureRepository.findFeature(getFeatureId());
+	}
+
+
+	// -- fullyQualifiedName (property, programmatic)
+	@Programmatic // in the title
+	public String getFullyQualifiedName() {
+		return getFeatureId().getFullyQualifiedName();
+	}
+
+
+
+
+	// -- type (programmatic)
+	@Programmatic
+	public ApplicationFeatureType getType() {
+		return getFeatureId().getType();
+	}
+
+
+
+
+	// -- packageName
+	public static class PackageNameDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, String> {}
+
+	@Property(
+			domainEvent = PackageNameDomainEvent.class
+			)
+	@PropertyLayout(typicalLength=ApplicationFeature.TYPICAL_LENGTH_PKG_FQN)
+	@MemberOrder(name="Id", sequence = "2.2")
+	public String getPackageName() {
+		return getFeatureId().getPackageName();
+	}
+
+
+
+
+
+	// -- className
+
+	public static class ClassNameDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, String> {}
+
+	/**
+	 * For packages, will be null. Is in this class (rather than subclasses) so is shown in
+	 * {@link ApplicationPackage#getContents() package contents}.
+	 */
+	@Property(
+			domainEvent = ClassNameDomainEvent.class
+			)
+	@PropertyLayout(typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
+	@MemberOrder(name="Id", sequence = "2.3")
+	public String getClassName() {
+		return getFeatureId().getClassName();
+	}
+	public boolean hideClassName() {
+		return getType().hideClassName();
+	}
+
+
+
+
+
+	// -- memberName
+
+	public static class MemberNameDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, String> {}
+
+	/**
+	 * For packages and class names, will be null.
+	 */
+	@Property(
+			domainEvent = MemberNameDomainEvent.class
+			)
+	@PropertyLayout(typicalLength=ApplicationFeature.TYPICAL_LENGTH_MEMBER_NAME)
+	@MemberOrder(name="Id", sequence = "2.4")
+	public String getMemberName() {
+		return getFeatureId().getMemberName();
+	}
+
+	public boolean hideMemberName() {
+		return getType().hideMember();
+	}
+
+
+
+
+
+
+	// -- parent (property)
+
+	public static class ParentDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, ApplicationFeatureViewModel> {}
+
+	@Property(
+			domainEvent = ParentDomainEvent.class
+			)
+	@PropertyLayout(hidden=Where.ALL_TABLES)
+	@MemberOrder(name = "Parent", sequence = "2.6")
+	public ApplicationFeatureViewModel getParent() {
+		final ApplicationFeatureId parentId;
+		parentId = getType() == ApplicationFeatureType.MEMBER
+				? getFeatureId().getParentClassId()
+						: getFeatureId().getParentPackageId();
+				if(parentId == null) {
+					return null;
+				}
+				final ApplicationFeature feature = applicationFeatureRepository.findFeature(parentId);
+				if (feature == null) {
+					return null;
+				}
+				final Class<? extends ApplicationFeatureViewModel> cls = 
+						viewModelClassFor(parentId, applicationFeatureRepository);
+				return transitionHelper
+						.newViewModelInstance(cls, parentId.asEncodedString());
+
+	}
+
+
+
+
+	// -- contributed (property)
+
+	public static class ContributedDomainEvent extends PropertyDomainEvent<ApplicationFeatureViewModel, Boolean> {}
+
+	/**
+	 * For packages and class names, will be null.
+	 */
+	@Property(
+			domainEvent = ContributedDomainEvent.class
+			)
+	@MemberOrder(name="Contributed", sequence = "2.5.5")
+	public boolean isContributed() {
+		return getFeature().isContributed();
+	}
+
+	public boolean hideContributed() {
+		return getType().hideMember();
+	}
+
+
+
+
+	// -- permissions (collection)
+	public static class PermissionsDomainEvent extends CollectionDomainEvent<ApplicationFeatureViewModel, ApplicationPermission> {}
+
+	@Collection(
+			domainEvent = PermissionsDomainEvent.class
+			)
+	@CollectionLayout(
+			defaultView="table"
+			)
+	@MemberOrder(sequence = "10")
+	public List<ApplicationPermission> getPermissions() {
+		return applicationPermissionRepository.findByFeatureCached(getFeatureId());
+	}
+
+
+
+
+	// -- parentPackage (property, programmatic, for packages & classes only)
+
+	/**
+	 * The parent package feature of this class or package.
+	 */
+	@Programmatic
+	public ApplicationFeatureViewModel getParentPackage() {
+		return Functions.asViewModelForId(applicationFeatureRepository, transitionHelper).apply(getFeatureId().getParentPackageId());
+	}
+
+
+
+
+	// -- equals, hashCode, toString
+
+	private final static String propertyNames = "featureId";
+
+	@Override
+	public boolean equals(final Object obj) {
+		return ObjectContracts.equals(this, obj, propertyNames);
+	}
+
+	@Override
+	public int hashCode() {
+		return ObjectContracts.hashCode(this, propertyNames);
+	}
+
+	@Override
+	public String toString() {
+		return ObjectContracts.toString(this, propertyNames);
+	}
+
+
+	// -- helpers
+	<T extends ApplicationFeatureViewModel> List<T> asViewModels(final SortedSet<ApplicationFeatureId> members) {
+		val viewModelForId = Functions.<T>asViewModelForId(applicationFeatureRepository, transitionHelper);
+		return _Lists.map(members, viewModelForId);
+	}
+
+
+	// -- Functions
+
+	public static final class Functions {
+		private Functions(){}
+
+		public static <T extends ApplicationFeatureViewModel> Function<ApplicationFeatureId, T> asViewModelForId(
+				final ApplicationFeatureRepositoryDefault applicationFeatureRepository, 
+				final TransitionHelper transitionHelper) {
+			
+			return (ApplicationFeatureId input) -> 
+				_Casts.uncheckedCast(ApplicationFeatureViewModel
+						.newViewModel(input, applicationFeatureRepository, transitionHelper));
+
+		}
+		public static <T extends ApplicationFeatureViewModel> Function<ApplicationFeature, T> asViewModel(
+				final ApplicationFeatureRepositoryDefault applicationFeatureRepository, 
+				final TransitionHelper transitionHelper) {
+
+			return (ApplicationFeature input) ->
+				_Casts.uncheckedCast(ApplicationFeatureViewModel
+						.newViewModel(input.getFeatureId(), applicationFeatureRepository, transitionHelper));
+		}
+	}
+
+
+	// -- injected services
+	@javax.inject.Inject
+	RepositoryService repository;
+
+	@javax.inject.Inject
+	ApplicationFeatureRepositoryDefault applicationFeatureRepository;
+
+	@javax.inject.Inject
+	ApplicationPermissionRepository applicationPermissionRepository;
+
+	@javax.inject.Inject
+	TransitionHelper transitionHelper;
+
+
 
 }
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModels.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModels.java
index c4a43de..f241033 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModels.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/feature/ApplicationFeatureViewModels.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.extensions.secman.jdo.app.feature;
 
+import java.util.Collection;
 import java.util.List;
 
 import javax.inject.Inject;
@@ -32,14 +33,12 @@ import org.apache.isis.applib.annotation.RestrictTo;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.jdo.TransitionHelper;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
 @DomainService(
         nature = NatureOfService.VIEW,
         objectType = "isissecurity.ApplicationFeatureViewModels",
@@ -158,12 +157,15 @@ public class ApplicationFeatureViewModels  {
 
     // -- HELPERS
     
-    private <T extends ApplicationFeatureViewModel> List<T> asViewModels(final Iterable<ApplicationFeature> features, final Class<T> cls) {
-        return Lists.newArrayList(
-                Iterables.transform(
+    private <T extends ApplicationFeatureViewModel> List<T> asViewModels(
+    		final Collection<ApplicationFeature> features, 
+    		final Class<T> cls) {
+    	
+        return _Lists.map(
                         features,
-                        ApplicationFeatureViewModel.Functions.<T>asViewModel(applicationFeatureRepository, transitionHelper)
-                ));
+                        ApplicationFeatureViewModel.Functions
+                        	.<T>asViewModel(applicationFeatureRepository, transitionHelper)
+                );
     }
 
     // -- DEPENDENCIES
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_filterPermissions.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_filterPermissions.java
index 0b4d65f..5ba1854 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_filterPermissions.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_filterPermissions.java
@@ -20,12 +20,8 @@ package org.apache.isis.extensions.secman.jdo.app.user;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.Set;
-
-import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import java.util.Objects;
+import java.util.function.Predicate;
 
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.MemberOrder;
@@ -36,6 +32,7 @@ import org.apache.isis.applib.annotation.ParameterLayout;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.jdo.TransitionHelper;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser;
@@ -43,6 +40,8 @@ import org.apache.isis.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 
+import lombok.val;
+
 @Mixin
 public class ApplicationUser_filterPermissions {
 
@@ -56,13 +55,9 @@ public class ApplicationUser_filterPermissions {
     public ApplicationUser_filterPermissions(final ApplicationUser user) {
         this.user = user;
     }
-    
-
-
 
     // -- filterPermissions (action)
 
-
     @Action(
             domainEvent = ActionDomainEvent.class,
             semantics = SemanticsOf.SAFE
@@ -74,8 +69,8 @@ public class ApplicationUser_filterPermissions {
             @Parameter(optionality = Optionality.OPTIONAL)
             @ParameterLayout(named="Class",  typicalLength=ApplicationFeature.TYPICAL_LENGTH_CLS_NAME)
             final String className) {
-        final java.util.Collection<ApplicationFeature> allMembers = applicationFeatureRepository.allMembers();
-        final Iterable<ApplicationFeature> filtered = Iterables.filter(allMembers, within(packageFqn, className));
+        val allMembers = applicationFeatureRepository.allMembers();
+        val filtered = _Lists.filter(allMembers, within(packageFqn, className));
         return asViewModels(filtered);
     }
 
@@ -96,9 +91,7 @@ public class ApplicationUser_filterPermissions {
 
 
     static Predicate<ApplicationFeature> within(final String packageFqn, final String className) {
-        return new Predicate<ApplicationFeature>() {
-            @Override
-            public boolean apply(final ApplicationFeature input) {
+        return (ApplicationFeature input) -> {
                 final ApplicationFeatureId inputFeatureId = input.getFeatureId();
 
                 // recursive match on package
@@ -109,17 +102,14 @@ public class ApplicationUser_filterPermissions {
                 }
 
                 // match on class (if specified)
-                return className == null || Objects.equal(inputFeatureId.getClassName(), className);
-            }
+                return className == null || Objects.equals(inputFeatureId.getClassName(), className);
         };
     }
 
-    List<UserPermissionViewModel> asViewModels(final Iterable<ApplicationFeature> features) {
-        return Lists.newArrayList(
-                Iterables.transform(
+    List<UserPermissionViewModel> asViewModels(final Collection<ApplicationFeature> features) {
+        return _Lists.map(
                         features,
-                        UserPermissionViewModel.Functions.asViewModel(user, transitionHelper))
-        );
+                        UserPermissionViewModel.Functions.asViewModel(user, transitionHelper));
     }
 
     @javax.inject.Inject
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_permissions.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_permissions.java
index 0ef0641..76d2288 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_permissions.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/ApplicationUser_permissions.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.extensions.secman.jdo.app.user;
 
+import java.util.Collection;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Action;
@@ -29,20 +30,20 @@ import org.apache.isis.applib.annotation.Mixin;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.jdo.TransitionHelper;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
+import lombok.val;
 
 @Mixin
 public class ApplicationUser_permissions {
 
-
-    public static class ActionDomainEvent extends SecurityModule.ActionDomainEvent<ApplicationUser_permissions> {}
+    public static class ActionDomainEvent extends SecurityModule.ActionDomainEvent<ApplicationUser_permissions> {
+		private static final long serialVersionUID = 1L;}
 
     // -- constructor
     private final ApplicationUser user;
@@ -65,16 +66,14 @@ public class ApplicationUser_permissions {
     )
     @MemberOrder(sequence = "30")
     public List<UserPermissionViewModel> $$() {
-        final java.util.Collection<ApplicationFeature> allMembers = applicationFeatureRepository.allMembers();
+        val allMembers = applicationFeatureRepository.allMembers();
         return asViewModels(allMembers);
     }
 
-    List<UserPermissionViewModel> asViewModels(final Iterable<ApplicationFeature> features) {
-        return Lists.newArrayList(
-                Iterables.transform(
+    List<UserPermissionViewModel> asViewModels(final Collection<ApplicationFeature> features) {
+        return _Lists.map(
                         features,
-                        UserPermissionViewModel.Functions.asViewModel(user, transitionHelper))
-        );
+                        UserPermissionViewModel.Functions.asViewModel(user, transitionHelper));
     }
 
     @javax.inject.Inject
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/UserPermissionViewModel.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/UserPermissionViewModel.java
index e03f610..b4352d2 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/UserPermissionViewModel.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/app/user/UserPermissionViewModel.java
@@ -18,12 +18,11 @@
  */
 package org.apache.isis.extensions.secman.jdo.app.user;
 
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
 import java.util.Iterator;
-
-import com.google.common.base.Function;
-import com.google.common.base.Splitter;
-import com.google.common.io.BaseEncoding;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import org.apache.isis.applib.ViewModel;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
@@ -38,6 +37,7 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
@@ -54,6 +54,8 @@ import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureType;
 
+import lombok.val;
+
 /**
  * View model identified by {@link ApplicationFeatureId} and backed by an
  * {@link ApplicationFeature}.
@@ -164,7 +166,9 @@ public class UserPermissionViewModel implements ViewModel {
     }
 
     private void parse(final String asString) {
-        final Iterator<String> iterator = Splitter.on(":").split(asString).iterator();
+        final Iterator<String> iterator = _Strings.splitThenStream(asString, ":")
+        		.collect(Collectors.toList())
+        		.listIterator();
 
         this.username = iterator.next();
 
@@ -215,17 +219,14 @@ public class UserPermissionViewModel implements ViewModel {
     }
 
     private static String base64UrlDecode(final String str) {
-        final byte[] bytes = BaseEncoding.base64Url().decode(str);
-        return new String(bytes, Charset.forName("UTF-8"));
+    	val bytes = Base64.getUrlDecoder().decode(str);
+    	return _Strings.ofBytes(bytes, StandardCharsets.UTF_8);
     }
 
     private static String base64UrlEncode(final String str) {
-        final byte[] bytes = str.getBytes(Charset.forName("UTF-8"));
-        return BaseEncoding.base64Url().encode(bytes);
+        val bytes = str.getBytes(StandardCharsets.UTF_8);
+        return Base64.getUrlEncoder().encodeToString(bytes);
     }
-
-    
-
     
 
     // -- user (derived property, hidden in parented tables)
@@ -389,27 +390,21 @@ public class UserPermissionViewModel implements ViewModel {
     }
     
 
-    
-
     // -- Functions
 
-    public static class Functions {
+    public static final class Functions {
+    	
         private Functions(){}
+        
         public static Function<ApplicationFeature, UserPermissionViewModel> asViewModel(final ApplicationUser user, final TransitionHelper transitionHelper) {
-            return new Function<ApplicationFeature, UserPermissionViewModel>(){
-                @Override
-                public UserPermissionViewModel apply(final ApplicationFeature input) {
+            return (final ApplicationFeature input) -> {
                     final ApplicationPermissionValueSet permissionSet = user.getPermissionSet();
                     final ApplicationPermissionValueSet.Evaluation changingEvaluation = permissionSet.evaluate(input.getFeatureId(), ApplicationPermissionMode.CHANGING);
                     final ApplicationPermissionValueSet.Evaluation viewingEvaluation = permissionSet.evaluate(input.getFeatureId(), ApplicationPermissionMode.VIEWING);
                     return UserPermissionViewModel.newViewModel(input.getFeatureId(), user, viewingEvaluation, changingEvaluation, transitionHelper);
-                }
             };
         }
     }
-    
-
-    
 
     // -- injected services
     @javax.inject.Inject
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java
index 1f3f231..cf6cdf7 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermission.java
@@ -19,15 +19,14 @@
 package org.apache.isis.extensions.secman.jdo.dom.permission;
 
 import java.util.Comparator;
+import java.util.Objects;
+import java.util.function.Function;
 
 import javax.jdo.annotations.IdGeneratorStrategy;
 import javax.jdo.annotations.IdentityType;
 import javax.jdo.annotations.InheritanceStrategy;
 import javax.jdo.annotations.VersionStrategy;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Ordering;
-
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.annotation.DomainObject;
@@ -479,7 +478,7 @@ public class ApplicationPermission implements Comparable<ApplicationPermission>
     public static class DefaultComparator implements Comparator<ApplicationPermission> {
         @Override
         public int compare(final ApplicationPermission o1, final ApplicationPermission o2) {
-            return Ordering.natural().compare(o1, o2);
+            return Objects.compare(o1, o2, (a, b) -> a.compareTo(b) );
         }
     }
     
@@ -490,20 +489,11 @@ public class ApplicationPermission implements Comparable<ApplicationPermission>
 
         private Functions(){}
 
-        public static final Function<ApplicationPermission, ApplicationPermissionValue> AS_VALUE = new Function<ApplicationPermission, ApplicationPermissionValue>() {
-            @Override
-            public ApplicationPermissionValue apply(final ApplicationPermission input) {
-                return new ApplicationPermissionValue(input.getFeatureId(), input.getRule(), input.getMode());
-            }
-        };
-
+        public static final Function<ApplicationPermission, ApplicationPermissionValue> AS_VALUE = 
+        		(ApplicationPermission input) ->
+                	new ApplicationPermissionValue(input.getFeatureId(), input.getRule(), input.getMode());
 
-        public static final Function<ApplicationPermission, String> GET_FQN = new Function<ApplicationPermission, String>() {
-            @Override
-            public String apply(final ApplicationPermission input) {
-                return input.getFeatureFqn();
-            }
-        };
+        public static final Function<ApplicationPermission, String> GET_FQN = ApplicationPermission::getFeatureFqn;
 
     }
     
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java
index fa4129b..412cc20 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/permission/ApplicationPermissionRepository.java
@@ -23,13 +23,22 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
-import com.google.common.base.Splitter;
-import com.google.common.collect.ImmutableListMultimap;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Multimaps;
+import org.apache.isis.applib.annotation.DomainService;
+import org.apache.isis.applib.annotation.NatureOfService;
+import org.apache.isis.applib.query.QueryDefault;
+import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
+import org.apache.isis.applib.services.factory.FactoryService;
+import org.apache.isis.applib.services.message.MessageService;
+import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
+import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.commons.internal.base._NullSafe;
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Multimaps;
 import org.apache.isis.commons.internal.collections._Sets;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
@@ -40,15 +49,8 @@ import org.apache.isis.metamodel.services.appfeat.ApplicationFeature;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureRepositoryDefault;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureType;
-import org.apache.isis.applib.annotation.DomainService;
-import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
-import org.apache.isis.applib.query.QueryDefault;
-import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
-import org.apache.isis.applib.services.factory.FactoryService;
-import org.apache.isis.applib.services.message.MessageService;
-import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
-import org.apache.isis.applib.services.repository.RepositoryService;
+
+import lombok.val;
 
 @DomainService(
         nature = NatureOfService.DOMAIN,
@@ -58,7 +60,6 @@ public class ApplicationPermissionRepository {
 
 
     // -- findByRole (programmatic)
-    @Programmatic
     public List<ApplicationPermission> findByRoleCached(final ApplicationRole role) {
         return queryResultsCache.execute(new Callable<List<ApplicationPermission>>() {
             @Override
@@ -68,7 +69,6 @@ public class ApplicationPermissionRepository {
         }, ApplicationPermissionRepository.class, "findByRoleCached", role);
     }
 
-    @Programmatic
     public List<ApplicationPermission> findByRole(final ApplicationRole role) {
         return repository.allMatches(
                 new QueryDefault<>(
@@ -78,7 +78,6 @@ public class ApplicationPermissionRepository {
     
 
     // -- findByUser (programmatic)
-    @Programmatic
     public List<ApplicationPermission> findByUserCached(final ApplicationUser user) {
         return queryResultsCache.execute(new Callable<List<ApplicationPermission>>() {
             @Override public List<ApplicationPermission> call() throws Exception {
@@ -87,7 +86,6 @@ public class ApplicationPermissionRepository {
         }, ApplicationPermissionRepository.class, "findByUserCached", user);
     }
 
-    @Programmatic
     public List<ApplicationPermission> findByUser(final ApplicationUser user) {
         final String username = user.getUsername();
         return findByUser(username);
@@ -106,11 +104,8 @@ public class ApplicationPermissionRepository {
      * Uses the {@link QueryResultsCache} in order to support
      * multiple lookups from <code>org.apache.isis.extensions.secman.jdo.app.user.UserPermissionViewModel</code>.
      */
-    @Programmatic
     public ApplicationPermission findByUserAndPermissionValue(final String username, final ApplicationPermissionValue permissionValue) {
 
-
-
         // obtain all permissions for this user, map by its value, and
         // put into query cache (so that this method can be safely called in a tight loop)
         final Map<ApplicationPermissionValue, List<ApplicationPermission>> permissions =
@@ -118,11 +113,18 @@ public class ApplicationPermissionRepository {
                 @Override
                 public Map<ApplicationPermissionValue, List<ApplicationPermission>> call() throws Exception {
 
-                    final List<ApplicationPermission> applicationPermissions = findByUser(username);
-                    final ImmutableListMultimap<ApplicationPermissionValue, ApplicationPermission> index = Multimaps
-                            .index(applicationPermissions, ApplicationPermission.Functions.AS_VALUE);
-
-                    return Multimaps.asMap(index);
+                    val permissions = findByUser(username);
+                    
+                    val permissionsByPermissionValue = 
+                    		_Multimaps.<ApplicationPermissionValue, ApplicationPermission>newListMultimap();
+                    
+                    _NullSafe.stream(permissions)
+                    .forEach(permission->{
+                    	val permissionValue = ApplicationPermission.Functions.AS_VALUE.apply(permission);
+                    	permissionsByPermissionValue.putElement(permissionValue, permission);
+                    });
+                    
+                    return permissionsByPermissionValue;
                 }
                 // note: it is correct that only username (and not permissionValue) is the key
                 // (we are obtaining all the perms for this user)
@@ -137,7 +139,6 @@ public class ApplicationPermissionRepository {
     
 
     // -- findByRoleAndRuleAndFeatureType (programmatic)
-    @Programmatic
     public List<ApplicationPermission> findByRoleAndRuleAndFeatureTypeCached(
             final ApplicationRole role, final ApplicationPermissionRule rule,
             final ApplicationFeatureType type) {
@@ -148,7 +149,6 @@ public class ApplicationPermissionRepository {
         }, ApplicationPermissionRepository.class, "findByRoleAndRuleAndFeatureTypeCached", role, rule, type);
     }
 
-    @Programmatic
     public List<ApplicationPermission> findByRoleAndRuleAndFeatureType(
             final ApplicationRole role, final ApplicationPermissionRule rule,
             final ApplicationFeatureType type) {
@@ -162,7 +162,6 @@ public class ApplicationPermissionRepository {
     
 
     // -- findByRoleAndRuleAndFeature (programmatic)
-    @Programmatic
     public ApplicationPermission findByRoleAndRuleAndFeatureCached(
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
@@ -175,7 +174,6 @@ public class ApplicationPermissionRepository {
         }, ApplicationPermissionRepository.class, "findByRoleAndRuleAndFeatureCached", role, rule, type, featureFqn);
     }
 
-    @Programmatic
     public ApplicationPermission findByRoleAndRuleAndFeature(
             final ApplicationRole role,
             final ApplicationPermissionRule rule, final ApplicationFeatureType type, final String featureFqn) {
@@ -191,7 +189,6 @@ public class ApplicationPermissionRepository {
     
 
     // -- findByFeature (programmatic)
-    @Programmatic
     public List<ApplicationPermission> findByFeatureCached(final ApplicationFeatureId featureId) {
         return queryResultsCache.execute(new Callable<List<ApplicationPermission>>() {
             @Override public List<ApplicationPermission> call() throws Exception {
@@ -200,7 +197,6 @@ public class ApplicationPermissionRepository {
         }, ApplicationPermissionRepository.class, "findByFeatureCached", featureId);
     }
 
-    @Programmatic
     public List<ApplicationPermission> findByFeature(final ApplicationFeatureId featureId) {
         return repository.allMatches(
                 new QueryDefault<>(
@@ -212,7 +208,6 @@ public class ApplicationPermissionRepository {
 
     // -- newPermission (programmatic)
 
-    @Programmatic
     public ApplicationPermission newPermission(
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
@@ -228,7 +223,6 @@ public class ApplicationPermissionRepository {
         return newPermissionNoCheck(role, rule, mode, featureType, featureFqn);
     }
 
-    @Programmatic
     public ApplicationPermission newPermissionNoCheck(
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
@@ -249,7 +243,6 @@ public class ApplicationPermissionRepository {
         return permission;
     }
 
-    @Programmatic
     public ApplicationPermission newPermission(
             final ApplicationRole role,
             final ApplicationPermissionRule rule,
@@ -280,7 +273,6 @@ public class ApplicationPermissionRepository {
     
 
     // -- allPermission (programmatic)
-    @Programmatic
     public List<ApplicationPermission> allPermissions() {
         return repository.allInstances(ApplicationPermission.class);
     }
@@ -288,7 +280,6 @@ public class ApplicationPermissionRepository {
 
     // -- findOrphaned (programmatic)
 
-    @Programmatic
     public List<ApplicationPermission> findOrphaned() {
 
         final Collection<String> packageNames = applicationFeatureRepository.packageNames();
@@ -299,7 +290,7 @@ public class ApplicationPermissionRepository {
             appendClasses(packageName, ApplicationMemberType.ACTION, availableClasses);
         }
 
-        final List<ApplicationPermission> orphaned = Lists.newArrayList();
+        final List<ApplicationPermission> orphaned = _Lists.newArrayList();
 
         final List<ApplicationPermission> permissions = allPermissions();
         for (ApplicationPermission permission : permissions) {
@@ -320,7 +311,9 @@ public class ApplicationPermissionRepository {
                 break;
             case MEMBER:
 
-                final List<String> split = Splitter.on('#').splitToList(featureFqn);
+                final List<String> split = _Strings.splitThenStream(featureFqn, "#")
+                	.collect(Collectors.toList());
+                
                 final String fqClassName = split.get(0);
                 final String memberName = split.get(1);
 
@@ -349,7 +342,7 @@ public class ApplicationPermissionRepository {
     }
 
     private List<String> memberNamesOf(final String packageName, final String className) {
-        final List<String> memberNames = Lists.newArrayList();
+        final List<String> memberNames = _Lists.newArrayList();
         appendMembers(packageName, className, ApplicationMemberType.PROPERTY, memberNames);
         appendMembers(packageName, className, ApplicationMemberType.COLLECTION, memberNames);
         appendMembers(packageName, className, ApplicationMemberType.ACTION, memberNames);
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java
index 112d5f8..ea6d5d3 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRole.java
@@ -19,7 +19,6 @@
 package org.apache.isis.extensions.secman.jdo.dom.role;
 
 import java.util.List;
-import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -27,11 +26,6 @@ import javax.jdo.annotations.IdGeneratorStrategy;
 import javax.jdo.annotations.IdentityType;
 import javax.jdo.annotations.InheritanceStrategy;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-
-
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
@@ -54,6 +48,7 @@ import org.apache.isis.applib.services.appfeat.ApplicationMemberType;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.types.DescriptionType;
 import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
@@ -564,10 +559,9 @@ public class ApplicationRole implements Comparable<ApplicationRole> {
             final ApplicationFeatureType type) {
         final List<ApplicationPermission> permissions = applicationPermissionRepository.findByRoleAndRuleAndFeatureTypeCached(
                 this, rule, type);
-        return Lists.newArrayList(
-                Iterables.transform(
+        return _Lists.map(
                         permissions,
-                        ApplicationPermission.Functions.GET_FQN));
+                        ApplicationPermission.Functions.GET_FQN);
     }
 
     
@@ -620,7 +614,7 @@ public class ApplicationRole implements Comparable<ApplicationRole> {
 
     public List<ApplicationUser> autoComplete0AddUser(final String search) {
         final List<ApplicationUser> matchingSearch = applicationUserRepository.find(search);
-        final List<ApplicationUser> list = Lists.newArrayList(matchingSearch);
+        final List<ApplicationUser> list = _Lists.newArrayList(matchingSearch);
         list.removeAll(getUsers());
         return list;
     }
@@ -691,20 +685,6 @@ public class ApplicationRole implements Comparable<ApplicationRole> {
     }
     
 
-    // -- Functions
-
-    public static class Functions {
-        private Functions(){}
-
-        public static Function<ApplicationRole, String> GET_NAME = new Function<ApplicationRole, String>() {
-            @Override
-            public String apply(final ApplicationRole input) {
-                return input.getName();
-            }
-        };
-    }
-    
-
     // -- equals, hashCode, compareTo, toString
     private final static String propertyNames = "name";
 
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java
index f87eda9..729bfd3 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/role/ApplicationRoleRepository.java
@@ -22,8 +22,6 @@ import java.util.List;
 
 import javax.inject.Inject;
 
-import com.google.common.collect.Lists;
-
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
@@ -33,6 +31,7 @@ import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
+import org.apache.isis.commons.internal.collections._Lists;
 
 @DomainService(
         nature = NatureOfService.DOMAIN,
@@ -77,7 +76,7 @@ public class ApplicationRoleRepository  {
             String nameRegex = String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."));
             return repository.allMatches(new QueryDefault<>(ApplicationRole.class, "findByNameContaining", "nameRegex", nameRegex));
         }
-        return Lists.newArrayList();
+        return _Lists.newArrayList();
     }
 
     @Programmatic
@@ -104,7 +103,7 @@ public class ApplicationRoleRepository  {
         if (search != null && search.length() > 0 ) {
             return findNameContaining(search);
         }
-        return Lists.newArrayList();
+        return _Lists.newArrayList();
     }
 
 }
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.java
index fb13fff..74c03df 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancy.java
@@ -47,12 +47,11 @@ import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.util.ObjectContracts;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.SecurityModule;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUserRepository;
 
-import com.google.common.collect.Lists;
-
 import lombok.Getter;
 import lombok.Setter;
 
@@ -98,24 +97,12 @@ import lombok.Setter;
 public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     public static abstract class PropertyDomainEvent<T> extends SecurityModule.PropertyDomainEvent<ApplicationTenancy, T> {
-
-        /**
-         * 
-         */
         private static final long serialVersionUID = 1L;}
 
     public static abstract class CollectionDomainEvent<T> extends SecurityModule.CollectionDomainEvent<ApplicationTenancy, T> {
-
-        /**
-         * 
-         */
         private static final long serialVersionUID = 1L;}
 
     public static abstract class ActionDomainEvent extends SecurityModule.ActionDomainEvent<ApplicationTenancy> {
-
-        /**
-         * 
-         */
         private static final long serialVersionUID = 1L;}
 
     
@@ -126,7 +113,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- name (property, title)
 
-    public static class NameDomainEvent extends PropertyDomainEvent<String> {}
+    public static class NameDomainEvent extends PropertyDomainEvent<String> {
+		private static final long serialVersionUID = 1L;}
 
     @javax.jdo.annotations.Column(allowsNull="false", length = MAX_LENGTH_NAME)
     @Title
@@ -146,7 +134,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- updateName (action)
 
-    public static class UpdateNameDomainEvent extends ActionDomainEvent {}
+    public static class UpdateNameDomainEvent extends ActionDomainEvent {
+		private static final long serialVersionUID = 1L;}
 
     @Action(
             domainEvent =UpdateNameDomainEvent.class,
@@ -168,7 +157,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- path
 
-    public static class PathDomainEvent extends PropertyDomainEvent<String> {}
+    public static class PathDomainEvent extends PropertyDomainEvent<String> {
+		private static final long serialVersionUID = 1L;}
 
 
     @javax.jdo.annotations.PrimaryKey
@@ -184,7 +174,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- users (collection)
 
-    public static class UsersDomainEvent extends CollectionDomainEvent<ApplicationUser> {}
+    public static class UsersDomainEvent extends CollectionDomainEvent<ApplicationUser> {
+		private static final long serialVersionUID = 1L;}
 
     @Collection(
             domainEvent = UsersDomainEvent.class,
@@ -210,7 +201,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- addUser (action)
 
-    public static class AddUserDomainEvent extends ActionDomainEvent {}
+    public static class AddUserDomainEvent extends ActionDomainEvent {
+		private static final long serialVersionUID = 1L;}
 
     @Action(
            domainEvent = AddUserDomainEvent.class,
@@ -228,18 +220,16 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     public List<ApplicationUser> autoComplete0AddUser(final String search) {
         final List<ApplicationUser> matchingSearch = applicationUserRepository.find(search);
-        final List<ApplicationUser> list = Lists.newArrayList(matchingSearch);
+        final List<ApplicationUser> list = _Lists.newArrayList(matchingSearch);
         list.removeAll(getUsers());
         return list;
     }
 
 
-
-    
-
     // -- removeUser (action)
 
-    public static class RemoveUserDomainEvent extends ActionDomainEvent {}
+    public static class RemoveUserDomainEvent extends ActionDomainEvent {
+		private static final long serialVersionUID = 1L;}
 
     @Action(
             domainEvent = RemoveUserDomainEvent.class,
@@ -265,7 +255,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- parent (property)
 
-    public static class ParentDomainEvent extends PropertyDomainEvent<ApplicationTenancy> {}
+    public static class ParentDomainEvent extends PropertyDomainEvent<ApplicationTenancy> {
+		private static final long serialVersionUID = 1L;}
 
 
     @javax.jdo.annotations.Column(name = "parentPath", allowsNull = "true")
@@ -283,7 +274,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- updateParent (action)
 
-    public static class UpdateParentDomainEvent extends ActionDomainEvent {}
+    public static class UpdateParentDomainEvent extends ActionDomainEvent {
+		private static final long serialVersionUID = 1L;}
 
     @Action(
             domainEvent = UpdateParentDomainEvent.class,
@@ -307,7 +299,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- children
 
-    public static class ChildrenDomainEvent extends CollectionDomainEvent<ApplicationTenancy> {}
+    public static class ChildrenDomainEvent extends CollectionDomainEvent<ApplicationTenancy> {
+		private static final long serialVersionUID = 1L;}
 
     @javax.jdo.annotations.Persistent(mappedBy = "parent")
     @Collection(
@@ -333,7 +326,8 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
 
     // -- addChild (action)
 
-    public static class AddChildDomainEvent extends ActionDomainEvent {}
+    public static class AddChildDomainEvent extends ActionDomainEvent {
+		private static final long serialVersionUID = 1L;}
 
     @Action(
             domainEvent = AddChildDomainEvent.class,
@@ -349,7 +343,6 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
         return this;
     }
 
-    
 
     // -- removeChild (action)
 
@@ -372,11 +365,10 @@ public class ApplicationTenancy implements Comparable<ApplicationTenancy> {
         return choices0RemoveChild().isEmpty()? "No children to remove": null;
     }
 
-    
-
 
     // -- delete (action)
-    public static class DeleteDomainEvent extends ActionDomainEvent {}
+    public static class DeleteDomainEvent extends ActionDomainEvent {
+		private static final long serialVersionUID = 1L;}
 
     @Action(
             domainEvent = DeleteDomainEvent.class,
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyRepository.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyRepository.java
index a9114d8..dc3f291 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyRepository.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/tenancy/ApplicationTenancyRepository.java
@@ -26,14 +26,12 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
-
-import com.google.common.collect.Lists;
+import org.apache.isis.commons.internal.collections._Lists;
 
 @DomainService(
         nature = NatureOfService.DOMAIN,
@@ -43,7 +41,6 @@ public class ApplicationTenancyRepository {
 
     // -- findByNameOrPathMatching
 
-    @Programmatic
     public List<ApplicationTenancy> findByNameOrPathMatchingCached(final String search) {
         return queryResultsCache.execute(new Callable<List<ApplicationTenancy>>() {
             @Override public List<ApplicationTenancy> call() throws Exception {
@@ -52,18 +49,15 @@ public class ApplicationTenancyRepository {
         }, ApplicationTenancyRepository.class, "findByNameOrPathMatchingCached", search);
     }
 
-    @Programmatic
     public List<ApplicationTenancy> findByNameOrPathMatching(final String search) {
         if (search == null) {
-            return Lists.newArrayList();
+            return _Lists.newArrayList();
         }
         return repository.allMatches(new QueryDefault<>(ApplicationTenancy.class, "findByNameOrPathMatching", "regex", String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."))));
     }
 
-    
-
     // -- findByName
-    @Programmatic
+    
     public ApplicationTenancy findByNameCached(final String name) {
         return queryResultsCache.execute(new Callable<ApplicationTenancy>() {
             @Override
@@ -73,7 +67,6 @@ public class ApplicationTenancyRepository {
         }, ApplicationTenancyRepository.class, "findByNameCached", name);
     }
 
-    @Programmatic
     public ApplicationTenancy findByName(final String name) {
         return repository.uniqueMatch(new QueryDefault<>(ApplicationTenancy.class, "findByName", "name", name));
     }
@@ -81,7 +74,6 @@ public class ApplicationTenancyRepository {
 
     // -- findByPath
 
-    @Programmatic
     public ApplicationTenancy findByPathCached(final String path) {
         return queryResultsCache.execute(new Callable<ApplicationTenancy>() {
             @Override
@@ -91,7 +83,6 @@ public class ApplicationTenancyRepository {
         }, ApplicationTenancyRepository.class, "findByPathCached", path);
     }
 
-    @Programmatic
     public ApplicationTenancy findByPath(final String path) {
         if (path == null) {
             return null;
@@ -107,13 +98,12 @@ public class ApplicationTenancyRepository {
         if (search != null && search.length() > 0) {
             return findByNameOrPathMatching(search);
         }
-        return Lists.newArrayList();
+        return _Lists.newArrayList();
     }
     
 
     // -- newTenancy
 
-    @Programmatic
     public ApplicationTenancy newTenancy(
             final String name,
             final String path,
@@ -129,10 +119,8 @@ public class ApplicationTenancyRepository {
         return tenancy;
     }
 
-    
-
     // -- allTenancies
-    @Programmatic
+
     public List<ApplicationTenancy> allTenancies() {
         return queryResultsCache.execute(new Callable<List<ApplicationTenancy>>() {
             @Override
@@ -142,13 +130,10 @@ public class ApplicationTenancyRepository {
         }, ApplicationTenancyRepository.class, "allTenancies");
     }
 
-    @Programmatic
     public List<ApplicationTenancy> allTenanciesNoCache() {
         return repository.allInstances(ApplicationTenancy.class);
     }
 
-    
-
     // -- injected
     /**
      * Will only be injected to if the programmer has supplied an implementation.  Otherwise
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
index 433da66..bc7deb1 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUser.java
@@ -28,24 +28,6 @@ import javax.jdo.annotations.IdentityType;
 import javax.jdo.annotations.InheritanceStrategy;
 import javax.jdo.annotations.VersionStrategy;
 
-import com.google.common.base.Strings;
-import com.google.common.collect.Iterables;
-import org.apache.isis.commons.internal.collections._Sets;
-import org.apache.isis.extensions.secman.api.SecurityModule;
-import org.apache.isis.extensions.secman.api.encryption.PasswordEncryptionService;
-import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
-import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
-import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
-import org.apache.isis.extensions.secman.api.user.AccountType;
-import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
-import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission;
-import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermissionRepository;
-import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole;
-import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRoleRepository;
-import org.apache.isis.extensions.secman.jdo.dom.tenancy.HasAtPath;
-import org.apache.isis.extensions.secman.jdo.seed.scripts.IsisModuleSecurityAdminRoleAndPermissions;
-import org.apache.isis.extensions.secman.jdo.seed.scripts.IsisModuleSecurityAdminUser;
-import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
@@ -71,9 +53,28 @@ import org.apache.isis.applib.services.user.UserService;
 import org.apache.isis.applib.util.ObjectContracts;
 import org.apache.isis.applib.util.ObjectContracts.ObjectContract;
 import org.apache.isis.applib.value.Password;
+import org.apache.isis.commons.internal.base._Strings;
+import org.apache.isis.commons.internal.collections._Lists;
+import org.apache.isis.commons.internal.collections._Sets;
+import org.apache.isis.extensions.secman.api.SecurityModule;
+import org.apache.isis.extensions.secman.api.encryption.PasswordEncryptionService;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
+import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionValueSet;
+import org.apache.isis.extensions.secman.api.permission.PermissionsEvaluationService;
+import org.apache.isis.extensions.secman.api.user.AccountType;
+import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
+import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermission;
+import org.apache.isis.extensions.secman.jdo.dom.permission.ApplicationPermissionRepository;
+import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole;
+import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRoleRepository;
+import org.apache.isis.extensions.secman.jdo.dom.tenancy.HasAtPath;
+import org.apache.isis.extensions.secman.jdo.seed.scripts.IsisModuleSecurityAdminRoleAndPermissions;
+import org.apache.isis.extensions.secman.jdo.seed.scripts.IsisModuleSecurityAdminUser;
+import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureId;
 
 import lombok.Getter;
 import lombok.Setter;
+import lombok.val;
 
 @javax.jdo.annotations.PersistenceCapable(
         identityType = IdentityType.DATASTORE,
@@ -676,7 +677,7 @@ public class ApplicationUser implements Comparable<ApplicationUser>, HasUsername
     )
     @MemberOrder(name="Status", sequence = "4")
     public boolean isHasPassword() {
-        return !Strings.isNullOrEmpty(getEncryptedPassword());
+        return !_Strings.isNullOrEmpty(getEncryptedPassword());
     }
 
     public boolean hideHasPassword() {
@@ -929,10 +930,10 @@ public class ApplicationUser implements Comparable<ApplicationUser>, HasUsername
         if(cachedPermissionSet != null) {
             return cachedPermissionSet;
         }
-        final List<ApplicationPermission> permissions = applicationPermissionRepository.findByUser(this);
+        val permissions = applicationPermissionRepository.findByUser(this);
         return cachedPermissionSet =
                 new ApplicationPermissionValueSet(
-                        Iterables.transform(permissions, ApplicationPermission.Functions.AS_VALUE),
+                        _Lists.map(permissions, ApplicationPermission.Functions.AS_VALUE),
                         permissionsEvaluationService);
     }
     
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserRepository.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserRepository.java
index 1964d4c..1e59f8f 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserRepository.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/dom/user/ApplicationUserRepository.java
@@ -26,21 +26,19 @@ import javax.inject.Inject;
 import org.apache.isis.applib.annotation.Action;
 import org.apache.isis.applib.annotation.DomainService;
 import org.apache.isis.applib.annotation.NatureOfService;
-import org.apache.isis.applib.annotation.Programmatic;
 import org.apache.isis.applib.annotation.SemanticsOf;
 import org.apache.isis.applib.query.QueryDefault;
 import org.apache.isis.applib.services.factory.FactoryService;
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
 import org.apache.isis.applib.services.repository.RepositoryService;
 import org.apache.isis.applib.value.Password;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.extensions.secman.api.encryption.PasswordEncryptionService;
 import org.apache.isis.extensions.secman.api.user.AccountType;
 import org.apache.isis.extensions.secman.api.user.ApplicationUserStatus;
 import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole;
 import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRoleRepository;
 
-import com.google.common.collect.Lists;
-
 @DomainService(
         nature = NatureOfService.DOMAIN,
         repositoryFor = ApplicationUser.class
@@ -57,7 +55,6 @@ public class ApplicationUserRepository {
      * If the user does not exist, it will be automatically created.
      * </p>
      */
-    @Programmatic
     public ApplicationUser findOrCreateUserByUsername(
             final String username) {
         // slightly unusual to cache a function that modifies state, but safe because this is idempotent
@@ -73,11 +70,8 @@ public class ApplicationUserRepository {
         }, ApplicationUserRepository.class, "findOrCreateUserByUsername", username);
     }
 
-    
-
     // -- findByUsername
 
-    @Programmatic
     public ApplicationUser findByUsernameCached(final String username) {
         return queryResultsCache.execute(new Callable<ApplicationUser>() {
             @Override public ApplicationUser call() throws Exception {
@@ -86,18 +80,14 @@ public class ApplicationUserRepository {
         }, ApplicationUserRepository.class, "findByUsernameCached", username);
     }
 
-    @Programmatic
     public ApplicationUser findByUsername(final String username) {
         return repository.uniqueMatch(new QueryDefault<>(
                 ApplicationUser.class,
                 "findByUsername", "username", username));
     }
 
-    
-
     // -- findByEmailAddress (programmatic)
 
-    @Programmatic
     public ApplicationUser findByEmailAddressCached(final String emailAddress) {
         return queryResultsCache.execute(new Callable<ApplicationUser>() {
             @Override public ApplicationUser call() throws Exception {
@@ -106,28 +96,23 @@ public class ApplicationUserRepository {
         }, ApplicationUserRepository.class, "findByEmailAddressCached", emailAddress);
     }
 
-    @Programmatic
     public ApplicationUser findByEmailAddress(final String emailAddress) {
         return repository.uniqueMatch(new QueryDefault<>(
                 ApplicationUser.class,
                 "findByEmailAddress", "emailAddress", emailAddress));
     }
-    
 
     // -- findByName
 
-    @Programmatic
     public List<ApplicationUser> find(final String search) {
         final String regex = String.format("(?i).*%s.*", search.replace("*", ".*").replace("?", "."));
         return repository.allMatches(new QueryDefault<>(
                 ApplicationUser.class,
                 "find", "regex", regex));
     }
-    
 
     // -- newDelegateUser (action)
 
-    @Programmatic
     public ApplicationUser newDelegateUser(
             final String username,
             final ApplicationRole initialRole,
@@ -142,11 +127,9 @@ public class ApplicationUserRepository {
         repository.persist(user);
         return user;
     }
-    
 
     // -- newLocalUser (action)
 
-    @Programmatic
     public ApplicationUser newLocalUser(
             final String username,
             final Password password,
@@ -174,7 +157,6 @@ public class ApplicationUserRepository {
         return user;
     }
 
-    @Programmatic
     public String validateNewLocalUser(
             final String username,
             final Password password,
@@ -186,8 +168,6 @@ public class ApplicationUserRepository {
         return user.validateResetPassword(password, passwordRepeat);
     }
 
-    
-
     // -- newLocalUserBasedOn (action)
 
     public ApplicationUser newLocalUserBasedOn(
@@ -203,36 +183,27 @@ public class ApplicationUserRepository {
         }
         return user;
     }
-    
-
 
     // -- allUsers
 
-    @Programmatic
     public List<ApplicationUser> findByAtPath(final String atPath) {
         return repository.allMatches(new QueryDefault<>(
                 ApplicationUser.class,
                 "findByAtPath", "atPath", atPath));
     }
 
-    
-
-
     // -- allUsers
 
-    @Programmatic
     public List<ApplicationUser> allUsers() {
         return repository.allInstances(ApplicationUser.class);
     }
 
-    
-
     @Action(semantics = SemanticsOf.SAFE)
     public List<ApplicationUser> findMatching(final String search) {
         if (search != null && search.length() > 0) {
             return find(search);
         }
-        return Lists.newArrayList();
+        return _Lists.newArrayList();
     }
     
 
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/facets/TenantedAuthorizationFacetFactory.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/facets/TenantedAuthorizationFacetFactory.java
index 7007b12..af1206f 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/facets/TenantedAuthorizationFacetFactory.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/facets/TenantedAuthorizationFacetFactory.java
@@ -18,16 +18,12 @@
  */
 package org.apache.isis.extensions.secman.jdo.facets;
 
-import java.util.List;
+import java.util.Collections;
 import java.util.stream.Collectors;
 
-import com.google.common.base.Predicate;
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.ImmutableList;
-
 import org.apache.isis.applib.services.queryresultscache.QueryResultsCache;
-import org.apache.isis.applib.services.registry.ServiceRegistry;
 import org.apache.isis.applib.services.user.UserService;
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.extensions.secman.jdo.dom.tenancy.ApplicationTenancyEvaluator;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUserRepository;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -36,6 +32,8 @@ import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.FacetFactoryAbstract;
 import org.apache.isis.runtime.system.context.IsisContext;
 
+import lombok.val;
+
 public class TenantedAuthorizationFacetFactory extends FacetFactoryAbstract {
 
     public TenantedAuthorizationFacetFactory() {
@@ -65,35 +63,34 @@ public class TenantedAuthorizationFacetFactory extends FacetFactoryAbstract {
     }
 
     private TenantedAuthorizationFacetDefault createFacet(
-            final Class<?> cls, final FacetHolder holder) {
+            final Class<?> cls, 
+            final FacetHolder holder) {
 
-        ServiceRegistry serviceRegistry = IsisContext.getServiceRegistry();
+        val serviceRegistry = IsisContext.getServiceRegistry();
         
-        List<ApplicationTenancyEvaluator> evaluators = serviceRegistry
+        val evaluators = serviceRegistry
                 .select(ApplicationTenancyEvaluator.class)
                 .stream()
-                .collect(Collectors.toList());
+                .collect(Collectors.<ApplicationTenancyEvaluator>toList());
 
-        final ImmutableList<ApplicationTenancyEvaluator> evaluatorsForCls =
-                FluentIterable.from(evaluators).filter(new Predicate<ApplicationTenancyEvaluator>() {
-            @Override
-            public boolean apply(ApplicationTenancyEvaluator applicationTenancyEvaluator) {
-                return applicationTenancyEvaluator.handles(cls);
-            }
-        }).toList();
+        val evaluatorsForCls = Collections.unmodifiableList(
+        		_NullSafe.stream(evaluators)
+        		.filter(applicationTenancyEvaluator->applicationTenancyEvaluator.handles(cls))
+        		.collect(Collectors.<ApplicationTenancyEvaluator>toList()));
 
         if(evaluatorsForCls.isEmpty()) {
             return null;
         }
 
-        final ApplicationUserRepository applicationUserRepository =
+        val applicationUserRepository =
                 serviceRegistry.lookupService(ApplicationUserRepository.class).orElse(null);
-        final QueryResultsCache queryResultsCache = 
+        val queryResultsCache = 
                 serviceRegistry.lookupService(QueryResultsCache.class).orElse(null);
-        final UserService userService = 
+        val userService = 
                 serviceRegistry.lookupService(UserService.class).orElse(null);
 
-        return new TenantedAuthorizationFacetDefault(evaluatorsForCls, applicationUserRepository, queryResultsCache, userService, holder);
+        return new TenantedAuthorizationFacetDefault(
+        		evaluatorsForCls, applicationUserRepository, queryResultsCache, userService, holder);
     }
 
 
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
index 9abc465..b65cc69 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractRoleAndPermissionsFixtureScript.java
@@ -19,9 +19,12 @@
 package org.apache.isis.extensions.secman.jdo.seed.scripts;
 
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
 
 import javax.inject.Inject;
 
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.extensions.fixtures.legacy.fixturescripts.FixtureScript;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionMode;
 import org.apache.isis.extensions.secman.api.permission.ApplicationPermissionRule;
@@ -30,8 +33,7 @@ import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRole;
 import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRoleRepository;
 import org.apache.isis.metamodel.services.appfeat.ApplicationFeatureType;
 
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
+import lombok.val;
 
 public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScript {
 
@@ -120,27 +122,23 @@ public abstract class AbstractRoleAndPermissionsFixtureScript extends FixtureScr
         }
     }
 
-    private static Iterable<String> asFeatureFqns(Class<?>[] classes) {
-        return Iterables.transform(Arrays.asList(classes), new Function<Class<?>, String>(){
-            @Override
-            public String apply(Class<?> input) {
-                return input.getName();
-            }
-        });
+    private static List<String> asFeatureFqns(Class<?>[] classes) {
+        return _NullSafe.stream(classes)
+        		.map(Class::getName)
+        		.collect(Collectors.toList());
     }
 
     private static Iterable<String> asFeatureFqns(final Class<?> cls, final String[] members) {
-        return Iterables.transform(Arrays.asList(members), new Function<String,String>(){
-            @Override
-            public String apply(String memberName) {
-                final StringBuilder buf = new StringBuilder(cls.getName());
-                if(!memberName.startsWith("#")) {
-                    buf.append("#");
-                }
-                buf.append(memberName);
-                return buf.toString();
-            }
-        });
+    	return _NullSafe.stream(members)
+        		.map(memberName->{
+        			val buf = new StringBuilder(cls.getName());
+                    if(!memberName.startsWith("#")) {
+                        buf.append("#");
+                    }
+                    buf.append(memberName);
+                    return buf.toString();
+        		})
+        		.collect(Collectors.toList());
     }
 
     //region  >  (injected)
diff --git a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractUserAndRolesFixtureScript.java b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractUserAndRolesFixtureScript.java
index f0d59e9..fb737a7 100644
--- a/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractUserAndRolesFixtureScript.java
+++ b/extensions/secman/persistence-jdo/src/main/java/org/apache/isis/extensions/secman/jdo/seed/scripts/AbstractUserAndRolesFixtureScript.java
@@ -24,6 +24,7 @@ import java.util.List;
 import javax.inject.Inject;
 
 import org.apache.isis.applib.value.Password;
+import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.extensions.fixtures.legacy.fixturescripts.FixtureScript;
 import org.apache.isis.extensions.secman.api.user.AccountType;
@@ -32,8 +33,6 @@ import org.apache.isis.extensions.secman.jdo.dom.role.ApplicationRoleRepository;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUser;
 import org.apache.isis.extensions.secman.jdo.dom.user.ApplicationUserRepository;
 
-import com.google.common.collect.Lists;
-
 public class AbstractUserAndRolesFixtureScript extends FixtureScript {
 
     private final String username;
@@ -63,7 +62,7 @@ public class AbstractUserAndRolesFixtureScript extends FixtureScript {
         this.emailAddress = emailAddress;
         this.tenancyPath = tenancyPath;
         this.accountType = accountType;
-        this.roleNames = Collections.unmodifiableList(Lists.newArrayList(roleNames));
+        this.roleNames = Collections.unmodifiableList(_Lists.newArrayList(roleNames));
     }
 
     @Override
diff --git a/extensions/secman/pom.xml b/extensions/secman/pom.xml
index 5304b7d..ae30263 100644
--- a/extensions/secman/pom.xml
+++ b/extensions/secman/pom.xml
@@ -36,9 +36,6 @@
     <properties>
         <jar-plugin.automaticModuleName>org.apache.isis.extensions.secman</jar-plugin.automaticModuleName>
         <git-plugin.propertiesDir>org/apache/isis/extensions/secman</git-plugin.propertiesDir>
-        
-        <jbcrypt.version>0.4</jbcrypt.version>
-        
     </properties>
 
     <dependencies>
@@ -52,12 +49,6 @@
 			<groupId>org.apache.isis.core</groupId>
 			<artifactId>isis-security</artifactId>
 		</dependency>
-		
-		<dependency>
-			<groupId>com.google.guava</groupId>
-			<artifactId>guava</artifactId>
-			<scope>provided</scope>
-		</dependency>
 
     </dependencies>