You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@archiva.apache.org by ma...@apache.org on 2020/11/02 15:59:06 UTC

[archiva-redback-core] branch master updated: API V2 refactoring and OpenAPI documentation

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

martin_s pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/archiva-redback-core.git


The following commit(s) were added to refs/heads/master by this push:
     new 8696d7c  API V2 refactoring and OpenAPI documentation
8696d7c is described below

commit 8696d7cee3d688423cf56d4ac686aeee09383ae6
Author: Martin Stockhammer <ma...@apache.org>
AuthorDate: Mon Nov 2 16:58:59 2020 +0100

    API V2 refactoring and OpenAPI documentation
---
 .../redback/rest/api/model/ErrorMessage.java       |  12 +-
 .../redback/rest/api/model/RedbackRestError.java   |   4 +-
 .../rest/api/model/v2/AvailabilityStatus.java      |   5 +
 .../redback/rest/api/model/v2/Operation.java       |  98 +++++++
 .../redback/rest/api/model/v2/Permission.java      | 107 ++++++++
 .../redback/rest/api/model/v2/Resource.java        |  98 +++++++
 .../archiva/redback/rest/api/model/v2/User.java    |  17 +-
 .../rest/api/model/v2/{User.java => UserInfo.java} |  87 +++----
 .../rest/api/model/v2/VerificationStatus.java      |  64 +++++
 .../api/services/v2/AuthenticationService.java     |  44 +++-
 .../redback/rest/api/services/v2/UserService.java  | 283 +++++++++++++--------
 .../services/v2/DefaultAuthenticationService.java  |  13 +-
 .../rest/services/v2/DefaultUserService.java       |  33 +--
 .../v2/NativeAuthenticationServiceTest.java        |   2 +-
 .../redback/rest/services/v2/UserServiceTest.java  |  59 ++---
 15 files changed, 693 insertions(+), 233 deletions(-)

diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ErrorMessage.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ErrorMessage.java
index 0615639..888b4e9 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ErrorMessage.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/ErrorMessage.java
@@ -18,6 +18,8 @@ package org.apache.archiva.redback.rest.api.model;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.media.Schema;
+
 import javax.xml.bind.annotation.XmlRootElement;
 import java.io.Serializable;
 
@@ -26,17 +28,18 @@ import java.io.Serializable;
  * @since 1.4
  */
 @XmlRootElement( name = "errorMessage" )
+@Schema(name="ErrorMessage",description = "Information about the error, that occured while processing the REST request.")
 public class ErrorMessage
     implements Serializable
 {
-    private String errorKey;
+    private String errorKey = "";
 
-    private String[] args;
+    private String[] args = EMPTY;
 
     /**
      * @since 2.1 for message without any key
      */
-    private String message;
+    private String message = "";
 
     private static final String[] EMPTY = new String[0];
 
@@ -61,6 +64,7 @@ public class ErrorMessage
         return new ErrorMessage( errorKey, args );
     }
 
+    @Schema(description = "The key of the error message. If this is empty, the message message must be set.")
     public String getErrorKey()
     {
         return errorKey;
@@ -71,6 +75,7 @@ public class ErrorMessage
         this.errorKey = errorKey;
     }
 
+    @Schema(description = "Parameters that can be filled to the translated error message")
     public String[] getArgs()
     {
         return args;
@@ -81,6 +86,7 @@ public class ErrorMessage
         this.args = args;
     }
 
+    @Schema(description = "Full error message. Either additional to the key in the default language, or if the message is without key.")
     public String getMessage()
     {
         return message;
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/RedbackRestError.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/RedbackRestError.java
index 5e6805e..5d539ca 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/RedbackRestError.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/RedbackRestError.java
@@ -18,6 +18,7 @@ package org.apache.archiva.redback.rest.api.model;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
 import org.apache.commons.lang3.StringUtils;
 
@@ -31,6 +32,7 @@ import java.util.List;
  * @since 1.4
  */
 @XmlRootElement( name = "redbackRestError" )
+@Schema(name="RedbackRestError", description = "Contains a list of error messages that resulted from the current REST call")
 public class RedbackRestError
     implements Serializable
 {
@@ -51,7 +53,7 @@ public class RedbackRestError
         }
     }
 
-
+    @Schema(name="errorMessages", description = "The list of errors that occurred while processing the REST request")
     public List<ErrorMessage> getErrorMessages()
     {
         return errorMessages;
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/AvailabilityStatus.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/AvailabilityStatus.java
index b219f42..10f0f03 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/AvailabilityStatus.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/AvailabilityStatus.java
@@ -18,6 +18,8 @@ package org.apache.archiva.redback.rest.api.model.v2;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.media.Schema;
+
 import javax.xml.bind.annotation.XmlRootElement;
 import java.time.Instant;
 import java.time.OffsetDateTime;
@@ -30,6 +32,7 @@ import java.time.ZoneId;
  * @author Martin Stockhammer <ma...@apache.org>
  */
 @XmlRootElement(name="availabilityStatus")
+@Schema(name="AvailabilityStatus", description = "Status of availability of a requested resource")
 public class AvailabilityStatus
 {
     boolean exists = false;
@@ -50,6 +53,7 @@ public class AvailabilityStatus
         this.since = OffsetDateTime.ofInstant( Instant.EPOCH, ZoneId.systemDefault() );
     }
 
+    @Schema(description = "Returns true, if the resource exists")
     public boolean isExists( )
     {
         return exists;
@@ -60,6 +64,7 @@ public class AvailabilityStatus
         this.exists = exists;
     }
 
+    @Schema(description = "Returns the last date since the resource was updated")
     public OffsetDateTime getSince( )
     {
         return since;
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Operation.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Operation.java
new file mode 100644
index 0000000..0dc30e3
--- /dev/null
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Operation.java
@@ -0,0 +1,98 @@
+package org.apache.archiva.redback.rest.api.model.v2;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+
+/**
+ * @author Olivier Lamy
+ * @since 1.4
+ */
+@XmlRootElement( name = "operation" )
+@Schema(name="Operation", description = "Operation assigned to a permission")
+public class Operation
+    implements Serializable
+{
+    private static final long serialVersionUID = 3666638961610656624L;
+    private String name;
+
+    private String description;
+
+    private boolean permanent;
+
+    public Operation()
+    {
+        // no op
+    }
+
+    public Operation( org.apache.archiva.redback.rbac.Operation operation )
+    {
+        this.name = operation.getName();
+        this.description = operation.getDescription();
+        this.permanent = operation.isPermanent();
+    }
+
+    @Schema(description = "The operation name")
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    @Schema(description = "The description of the operation")
+    public String getDescription()
+    {
+        return description;
+    }
+
+    public void setDescription( String description )
+    {
+        this.description = description;
+    }
+
+    @Schema(description = "True, if this operation is permanent")
+    public boolean isPermanent()
+    {
+        return permanent;
+    }
+
+    public void setPermanent( boolean permanent )
+    {
+        this.permanent = permanent;
+    }
+
+    @Override
+    public String toString()
+    {
+        final StringBuilder sb = new StringBuilder();
+        sb.append( "Operation" );
+        sb.append( "{name='" ).append( name ).append( '\'' );
+        sb.append( ", description='" ).append( description ).append( '\'' );
+        sb.append( ", permanent=" ).append( permanent );
+        sb.append( '}' );
+        return sb.toString();
+    }
+}
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Permission.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Permission.java
new file mode 100644
index 0000000..995bc9c
--- /dev/null
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Permission.java
@@ -0,0 +1,107 @@
+package org.apache.archiva.redback.rest.api.model.v2;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import org.apache.archiva.redback.rest.api.model.v2.Resource;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+
+/**
+ * @author Olivier Lamy
+ * @since 1.4
+ */
+@XmlRootElement( name = "permission" )
+@Schema(name="Permission", description = "Permission that allows operation on resources")
+public class Permission
+    implements Serializable
+{
+    private static final long serialVersionUID = 4243488525173718059L;
+    private String name;
+
+    private String description;
+
+    private Operation operation;
+
+    private Resource resource;
+
+    private boolean permanent;
+
+    public Permission()
+    {
+        // no op
+    }
+
+    public Permission( org.apache.archiva.redback.rbac.Permission permission )
+    {
+        this.name = permission.getName();
+        this.description = permission.getDescription();
+        this.operation = permission.getOperation() == null ? null : new Operation( permission.getOperation() );
+        this.resource = permission.getResource() == null ? null : new Resource( permission.getResource() );
+        this.permanent = permission.isPermanent();
+    }
+
+    @Schema(name="name", description = "The identifier of the permission")
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName( String name )
+    {
+        this.name = name;
+    }
+
+    @Schema(name="operation", description = "The operation that is assigned to this permission")
+    public Operation getOperation()
+    {
+        return operation;
+    }
+
+    public void setOperation( Operation operation )
+    {
+        this.operation = operation;
+    }
+
+    @Schema(name="resource", description = "The resource this permission applies to")
+    public Resource getResource()
+    {
+        return resource;
+    }
+
+    public void setResource( Resource resource )
+    {
+        this.resource = resource;
+    }
+
+    @Override
+    public String toString()
+    {
+        final StringBuilder sb = new StringBuilder();
+        sb.append( "Permission" );
+        sb.append( "{name='" ).append( name ).append( '\'' );
+        sb.append( ", description='" ).append( description ).append( '\'' );
+        sb.append( ", operation=" ).append( operation );
+        sb.append( ", resource=" ).append( resource );
+        sb.append( ", permanent=" ).append( permanent );
+        sb.append( '}' );
+        return sb.toString();
+    }
+}
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Resource.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Resource.java
new file mode 100644
index 0000000..e0c4328
--- /dev/null
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/Resource.java
@@ -0,0 +1,98 @@
+package org.apache.archiva.redback.rest.api.model.v2;
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.xml.bind.annotation.XmlRootElement;
+import java.io.Serializable;
+
+/**
+ * @author Olivier Lamy
+ * @since 1.4
+ */
+@XmlRootElement( name = "resource" )
+@Schema(name="Resource", description = "Resource where permissions are applied to")
+public class Resource
+    implements Serializable
+{
+    private static final long serialVersionUID = -4597120682491493340L;
+    private String identifier;
+
+    private boolean pattern;
+
+    private boolean permanent;
+
+    public Resource()
+    {
+        // no op
+    }
+
+    public Resource( org.apache.archiva.redback.rbac.Resource resource )
+    {
+        this.identifier = resource.getIdentifier();
+        this.pattern = resource.isPattern();
+        this.permanent = resource.isPermanent();
+    }
+
+    @Schema(name="identifier", description = "Identifier of the resource")
+    public String getIdentifier()
+    {
+        return identifier;
+    }
+
+    public void setIdentifier( String identifier )
+    {
+        this.identifier = identifier;
+    }
+
+    @Schema(name="pattern", description = "True, if this resource is just a pattern")
+    public boolean isPattern()
+    {
+        return pattern;
+    }
+
+    public void setPattern( boolean pattern )
+    {
+        this.pattern = pattern;
+    }
+
+    @Schema(name="permanent", description = "True, if this resource is permanent")
+    public boolean isPermanent()
+    {
+        return permanent;
+    }
+
+    public void setPermanent( boolean permanent )
+    {
+        this.permanent = permanent;
+    }
+
+    @Override
+    public String toString()
+    {
+        final StringBuilder sb = new StringBuilder();
+        sb.append( "Resource" );
+        sb.append( "{identifier='" ).append( identifier ).append( '\'' );
+        sb.append( ", pattern=" ).append( pattern );
+        sb.append( ", permanent=" ).append( permanent );
+        sb.append( '}' );
+        return sb.toString();
+    }
+}
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java
index de3c1b2..a2537aa 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java
@@ -1,5 +1,7 @@
 package org.apache.archiva.redback.rest.api.model.v2;
 
+import io.swagger.v3.oas.annotations.media.Schema;
+
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import java.io.Serializable;
@@ -28,6 +30,7 @@ import java.util.List;
  */
 
 @XmlRootElement( name = "user" )
+@Schema(name="User", description = "User information data")
 public class User
     implements Serializable
 {
@@ -142,8 +145,9 @@ public class User
     }
 
 
-    @XmlElement(name="user_id")
-    public String getUserId()
+    @Schema( name = "user_id", description = "The user id" )
+    @XmlElement( name = "user_id" )
+    public String getUserId( )
     {
         return userId;
     }
@@ -153,7 +157,8 @@ public class User
         this.userId = userId;
     }
 
-    public String getFullName()
+    @Schema( description = "The full name of the user" )
+    public String getFullName( )
     {
         return fullName;
     }
@@ -163,7 +168,8 @@ public class User
         this.fullName = fullName;
     }
 
-    public String getEmail()
+    @Schema( description = "Email address" )
+    public String getEmail( )
     {
         return email;
     }
@@ -173,6 +179,7 @@ public class User
         this.email = email;
     }
 
+    @Schema( description = "True, if user is validated, or False, if user is still in register phase.")
     public boolean isValidated()
     {
         return validated;
@@ -183,6 +190,7 @@ public class User
         this.validated = validated;
     }
 
+    @Schema(description = "True, if user is locked.")
     public boolean isLocked()
     {
         return locked;
@@ -193,6 +201,7 @@ public class User
         this.locked = isLocked;
     }
 
+
     public String getPassword()
     {
         return password;
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/UserInfo.java
similarity index 82%
copy from redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java
copy to redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/UserInfo.java
index de3c1b2..800600d 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/User.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/UserInfo.java
@@ -1,5 +1,7 @@
 package org.apache.archiva.redback.rest.api.model.v2;
 
+import io.swagger.v3.oas.annotations.media.Schema;
+
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlRootElement;
 import java.io.Serializable;
@@ -28,13 +30,12 @@ import java.util.List;
  */
 
 @XmlRootElement( name = "user" )
-public class User
+@Schema(name="User", description = "User information data")
+public class UserInfo
     implements Serializable
 {
 
-
-    private static final long serialVersionUID = 7457798933140993643L;
-
+    private static final long serialVersionUID = 822423853981984867L;
     private String id;
 
     private String userId;
@@ -47,14 +48,10 @@ public class User
 
     private boolean locked;
 
-    private String password;
-
     private boolean passwordChangeRequired;
 
     private boolean permanent;
 
-    private String confirmPassword;
-
     // Display Only Fields.
     private OffsetDateTime timestampAccountCreation;
 
@@ -63,12 +60,6 @@ public class User
     private OffsetDateTime timestampLastPasswordChange;
 
     /**
-     * for password change only
-     *
-     */
-    private String currentPassword;
-
-    /**
      * for roles update only <b>not return on user read</b>
      *
      * @since 2.0
@@ -95,12 +86,12 @@ public class User
     private String validationToken;
 
 
-    public User()
+    public UserInfo()
     {
         // no op
     }
 
-    public User( String userId, String fullName, String email, boolean validated, boolean locked )
+    public UserInfo( String userId, String fullName, String email, boolean validated, boolean locked )
     {
         this.userId = userId;
         this.fullName = fullName;
@@ -109,13 +100,12 @@ public class User
         this.locked = locked;
     }
 
-    public User( org.apache.archiva.redback.users.User user )
+    public UserInfo( org.apache.archiva.redback.users.User user )
     {
         setUserId( user.getUsername() );
         this.setEmail( user.getEmail() );
         this.setFullName( user.getFullName() );
         this.setLocked( user.isLocked() );
-        this.setPassword( user.getPassword() );
         this.setValidated( user.isValidated() );
         this.setPasswordChangeRequired( user.isPasswordChangeRequired() );
         this.setPermanent( user.isPermanent() );
@@ -142,8 +132,9 @@ public class User
     }
 
 
-    @XmlElement(name="user_id")
-    public String getUserId()
+    @Schema( name = "user_id", description = "The user id" )
+    @XmlElement( name = "user_id" )
+    public String getUserId( )
     {
         return userId;
     }
@@ -153,7 +144,8 @@ public class User
         this.userId = userId;
     }
 
-    public String getFullName()
+    @Schema( description = "The full name of the user" )
+    public String getFullName( )
     {
         return fullName;
     }
@@ -163,7 +155,8 @@ public class User
         this.fullName = fullName;
     }
 
-    public String getEmail()
+    @Schema( description = "Email address" )
+    public String getEmail( )
     {
         return email;
     }
@@ -173,6 +166,7 @@ public class User
         this.email = email;
     }
 
+    @Schema( description = "True, if user is validated, or False, if user is still in register phase.")
     public boolean isValidated()
     {
         return validated;
@@ -183,6 +177,7 @@ public class User
         this.validated = validated;
     }
 
+    @Schema(description = "True, if user is locked.")
     public boolean isLocked()
     {
         return locked;
@@ -193,17 +188,8 @@ public class User
         this.locked = isLocked;
     }
 
-    public String getPassword()
-    {
-        return password;
-    }
-
-    public void setPassword( String password )
-    {
-        this.password = password;
-    }
-
-    public boolean isPasswordChangeRequired()
+    @Schema( description = "True, if user has to change his password" )
+    public boolean isPasswordChangeRequired( )
     {
         return passwordChangeRequired;
     }
@@ -213,6 +199,7 @@ public class User
         this.passwordChangeRequired = passwordChangeRequired;
     }
 
+    @Schema(description = "True, if this is not a temporary user.")
     public boolean isPermanent()
     {
         return permanent;
@@ -223,16 +210,7 @@ public class User
         this.permanent = permanent;
     }
 
-    public String getConfirmPassword()
-    {
-        return confirmPassword;
-    }
-
-    public void setConfirmPassword( String confirmPassword )
-    {
-        this.confirmPassword = confirmPassword;
-    }
-
+    @Schema(description = "The date and time, when the account was first created.")
     public OffsetDateTime getTimestampAccountCreation()
     {
         return timestampAccountCreation;
@@ -248,6 +226,7 @@ public class User
         this.timestampAccountCreation = OffsetDateTime.ofInstant( timestampAccountCreation, ZoneId.systemDefault() );
     }
 
+    @Schema(description = "Date and time of the last successful login")
     public OffsetDateTime getTimestampLastLogin()
     {
         return timestampLastLogin;
@@ -263,6 +242,7 @@ public class User
         this.timestampLastLogin = OffsetDateTime.ofInstant( timestampLastLogin, ZoneId.systemDefault( ) );
     }
 
+    @Schema(description = "Date and time of the last password change")
     public OffsetDateTime getTimestampLastPasswordChange()
     {
         return timestampLastPasswordChange;
@@ -278,16 +258,7 @@ public class User
         this.timestampLastPasswordChange = OffsetDateTime.ofInstant( timestampLastPasswordChange, ZoneId.systemDefault() );
     }
 
-    public String getCurrentPassword()
-    {
-        return currentPassword;
-    }
-
-    public void setCurrentPassword( String currentPassword )
-    {
-        this.currentPassword = currentPassword;
-    }
-
+    @Schema(description = "The roles assigned to the user")
     public List<String> getAssignedRoles()
     {
         return assignedRoles;
@@ -298,6 +269,7 @@ public class User
         this.assignedRoles = assignedRoles;
     }
 
+    @Schema(description = "True, if this is user has readonly access")
     public boolean isReadOnly()
     {
         return readOnly;
@@ -308,6 +280,7 @@ public class User
         this.readOnly = readOnly;
     }
 
+    @Schema( description = "Id of the usermanager, where this user is registered")
     public String getUserManagerId()
     {
         return userManagerId;
@@ -318,6 +291,7 @@ public class User
         this.userManagerId = userManagerId;
     }
 
+    @Schema( description = "Current validation token of this user")
     public String getValidationToken() {
         return validationToken;
     }
@@ -326,6 +300,7 @@ public class User
         this.validationToken = validationToken;
     }
 
+    @Schema( description = "User id that is unique over all user managers")
     public String getId( )
     {
         return id;
@@ -348,11 +323,9 @@ public class User
             //", password='" + password + '\'' +
             ", passwordChangeRequired=" + passwordChangeRequired +
             ", permanent=" + permanent +
-            ", confirmPassword='" + confirmPassword + '\'' +
             ", timestampAccountCreation='" + timestampAccountCreation + '\'' +
             ", timestampLastLogin='" + timestampLastLogin + '\'' +
             ", timestampLastPasswordChange='" + timestampLastPasswordChange + '\'' +
-            ", previousPassword='" + currentPassword + '\'' +
             ", assignedRoles=" + assignedRoles +
             ", readOnly=" + readOnly +
             ", userManagerId='" + userManagerId + '\'' +
@@ -367,12 +340,12 @@ public class User
         {
             return true;
         }
-        if ( !( o instanceof User ) )
+        if ( !( o instanceof UserInfo ) )
         {
             return false;
         }
 
-        User user = (User) o;
+        UserInfo user = (UserInfo) o;
 
         if ( !userId.equals( user.userId ) )
         {
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/VerificationStatus.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/VerificationStatus.java
new file mode 100644
index 0000000..0f5b2c1
--- /dev/null
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/model/v2/VerificationStatus.java
@@ -0,0 +1,64 @@
+package org.apache.archiva.redback.rest.api.model.v2;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @author Martin Stockhammer <ma...@apache.org>
+ */
+@XmlRootElement(name="verificationStatus")
+@Schema(name="VerificationStatus", description = "The verification status of the user registration")
+public class VerificationStatus
+{
+    boolean success = false;
+    String accessToken;
+
+    public VerificationStatus() {
+
+    }
+
+    public VerificationStatus( boolean success ) {
+        this.success = success;
+    }
+
+    @Schema(name="success",description = "True, if verification was successful")
+    public boolean isSuccess( )
+    {
+        return success;
+    }
+
+    public void setSuccess( boolean success )
+    {
+        this.success = success;
+    }
+
+    @Schema(name="accessToken", description = "The access token that is used for registration")
+    public String getAccessToken( )
+    {
+        return accessToken;
+    }
+
+    public void setAccessToken( String accessToken )
+    {
+        this.accessToken = accessToken;
+    }
+}
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/AuthenticationService.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/AuthenticationService.java
index 769566b..bf29e62 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/AuthenticationService.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/AuthenticationService.java
@@ -20,15 +20,19 @@ package org.apache.archiva.redback.rest.api.services.v2;
  */
 
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
+import org.apache.archiva.redback.rest.api.model.RedbackRestError;
 import org.apache.archiva.redback.rest.api.model.v2.PingResult;
 import org.apache.archiva.redback.rest.api.model.v2.TokenRefreshRequest;
 import org.apache.archiva.redback.rest.api.model.v2.TokenRequest;
 import org.apache.archiva.redback.rest.api.model.v2.TokenResponse;
 import org.apache.archiva.redback.rest.api.model.User;
+import org.apache.archiva.redback.rest.api.model.v2.UserInfo;
 import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
 
 import javax.ws.rs.Consumes;
@@ -38,6 +42,8 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
 /**
  * Version 2 of authentication service
  *
@@ -59,6 +65,13 @@ public interface AuthenticationService
     @GET
     @Produces( { MediaType.APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true )
+    @Operation( summary = "Ping request.",
+        responses = {
+            @ApiResponse( responseCode = "200",
+                description = "Pong",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = PingResult.class))
+            )
+        })
     PingResult ping()
         throws RedbackServiceException;
 
@@ -72,7 +85,15 @@ public interface AuthenticationService
     @GET
     @Produces( { MediaType.APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = false, noPermission = true )
-    @Operation( summary = "Ping request to restricted service. You have to provide a valid authentication token." )
+    @Operation( summary = "Ping request to restricted service. You have to provide a valid authentication token.",
+        responses = {
+        @ApiResponse( responseCode = "200",
+            description = "Pong",
+            content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = PingResult.class))
+        ),
+        @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to ping",
+            content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) )
+    })
     @SecurityRequirement( name="BearerAuth" )
     PingResult pingWithAutz()
         throws RedbackServiceException;
@@ -89,7 +110,14 @@ public interface AuthenticationService
     @Operation( summary = "Authenticate by user/password login and return a bearer token, usable for further requests",
         responses = {
             @ApiResponse( description = "A access token, that has to be added to the Authorization header on authenticated requests. " +
-                "And refresh token, used to refresh the access token. Each token as a lifetime. After expiration it cannot be used anymore." )
+                "And refresh token, used to refresh the access token. Each token as a lifetime. After expiration it cannot be used anymore.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = TokenResponse.class))
+            ),
+            @ApiResponse( responseCode = "401", description = "Authentication failed. The response body tells more about the failure.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
+            @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to gather the information",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) )
+
         }
     )
     TokenResponse logIn( TokenRequest loginRequest )
@@ -106,7 +134,8 @@ public interface AuthenticationService
         "supported. You have to provide the refresh token in the payload. And you have to provide a valid Bearer access token in "+
         "the Authorization header.",
         responses = {
-            @ApiResponse( description = "The new access token," )
+            @ApiResponse( description = "The new access token",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = TokenResponse.class)))
         }
     )
     @SecurityRequirement( name="BearerAuth" )
@@ -122,8 +151,13 @@ public interface AuthenticationService
     @Produces( { MediaType.APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true )
     @Operation(summary = "Checks the request for a valid access token, and returns the user object that corresponds to the " +
-        "provided token.")
-    User getAuthenticatedUser()
+        "provided token.",
+        responses = {
+            @ApiResponse( description = "The new access token",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class)))
+        }
+    )
+    UserInfo getAuthenticatedUser()
         throws RedbackServiceException;
 
 }
diff --git a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/UserService.java b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/UserService.java
index 015660c..bc61b92 100644
--- a/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/UserService.java
+++ b/redback-integrations/redback-rest/redback-rest-api/src/main/java/org/apache/archiva/redback/rest/api/services/v2/UserService.java
@@ -19,7 +19,10 @@ package org.apache.archiva.redback.rest.api.services.v2;
  * under the License.
  */
 
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.headers.Header;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.responses.ApiResponse;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -27,17 +30,17 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import org.apache.archiva.redback.authorization.RedbackAuthorization;
 import org.apache.archiva.redback.integration.security.role.RedbackRoleConstants;
 import org.apache.archiva.redback.rest.api.model.ActionStatus;
+import org.apache.archiva.redback.rest.api.model.RedbackRestError;
+import org.apache.archiva.redback.rest.api.model.v2.Permission;
 import org.apache.archiva.redback.rest.api.model.v2.AvailabilityStatus;
-import org.apache.archiva.redback.rest.api.model.Operation;
-import org.apache.archiva.redback.rest.api.model.v2.SelfUserData;
 import org.apache.archiva.redback.rest.api.model.v2.PagedResult;
-import org.apache.archiva.redback.rest.api.model.Permission;
 import org.apache.archiva.redback.rest.api.model.v2.PingResult;
-import org.apache.archiva.redback.rest.api.model.ResetPasswordRequest;
 import org.apache.archiva.redback.rest.api.model.v2.RegistrationKey;
+import org.apache.archiva.redback.rest.api.model.v2.SelfUserData;
 import org.apache.archiva.redback.rest.api.model.v2.User;
+import org.apache.archiva.redback.rest.api.model.v2.UserInfo;
 import org.apache.archiva.redback.rest.api.model.v2.UserRegistrationRequest;
-import org.apache.archiva.redback.rest.api.model.VerificationStatus;
+import org.apache.archiva.redback.rest.api.model.v2.VerificationStatus;
 import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
 
 import javax.ws.rs.Consumes;
@@ -50,9 +53,9 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
 import java.util.Collection;
 
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 import static org.apache.archiva.redback.rest.api.Constants.DEFAULT_PAGE_LIMIT;
 
 @Path( "/users" )
@@ -63,10 +66,10 @@ public interface UserService
 {
     @Path( "{userId}" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION,
         resource = "{userId}" )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns information about a specific user",
+    @Operation( summary = "Returns information about a specific user",
         security = {
             @SecurityRequirement(
                 name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION
@@ -74,21 +77,25 @@ public interface UserService
         },
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If user was found in the database"
+                description = "If user was found in the database",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class))
+            ),
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to gather the information" )
+            @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to gather the information",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) )
         }
     )
-    User getUser( @PathParam( "userId" ) String userId )
+    UserInfo getUser( @PathParam( "userId" ) String userId )
         throws RedbackServiceException;
 
 
     @Path( "" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_LIST_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns all users defined. The result is paged.",
+    @Operation( summary = "Returns all users defined. The result is paged.",
         security = {
             @SecurityRequirement(
                 name = RedbackRoleConstants.USER_MANAGEMENT_USER_LIST_OPERATION
@@ -96,21 +103,23 @@ public interface UserService
         },
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the list could be returned"
+                description = "If the list could be returned",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = PagedResult.class))
             ),
-            @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to gather the information" )
+            @ApiResponse( responseCode = "403", description = "Authenticated user is not permitted to gather the information",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) )
         }
     )
-    PagedResult<User> getUsers( @QueryParam( "offset" ) @DefaultValue( "0" ) Integer offset,
+    PagedResult<UserInfo> getUsers( @QueryParam( "offset" ) @DefaultValue( "0" ) Integer offset,
                                       @QueryParam( "limit" ) @DefaultValue( value = DEFAULT_PAGE_LIMIT ) Integer limit)
         throws RedbackServiceException;
 
     @Path( "" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
-    @Consumes( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
+    @Consumes( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_CREATE_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Creates a user",
+    @Operation( summary = "Creates a user",
         security = {
             @SecurityRequirement(
                 name = RedbackRoleConstants.USER_MANAGEMENT_USER_CREATE_OPERATION
@@ -121,9 +130,11 @@ public interface UserService
                 description = "If user creation was successful",
                 headers = {
                     @Header( name="Location", description = "The URL of the created mapping", schema = @Schema(type="string"))
-                }
+                },
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class))
             ),
-            @ApiResponse( responseCode = "422", description = "Invalid input" ),
+            @ApiResponse( responseCode = "422", description = "Invalid input",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
             @ApiResponse( responseCode = "303", description = "The user exists already",
                 headers = {
                     @Header( name="Location", description = "The URL of existing user", schema = @Schema(type="string"))
@@ -131,14 +142,14 @@ public interface UserService
             )
         }
     )
-    User createUser( User user )
+    UserInfo createUser( User user )
         throws RedbackServiceException;
 
     @Path( "{userId}" )
     @DELETE
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_DELETE_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Deletes a given user",
+    @Operation( summary = "Deletes a given user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_DELETE_OPERATION )
         },
@@ -146,8 +157,10 @@ public interface UserService
             @ApiResponse( responseCode = "200",
                 description = "If user deletion was successful"
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for deletion." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for deletion.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) )
         }
     )
     void deleteUser( @PathParam( "userId" ) String userId )
@@ -155,22 +168,26 @@ public interface UserService
 
     @Path( "{userId}" )
     @PUT
-    @Produces( {MediaType.APPLICATION_JSON} )
+    @Produces( {APPLICATION_JSON} )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Updates an existing user",
+    @Operation( summary = "Updates an existing user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
         },
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If update was successful"
+                description = "If update was successful",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class))
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "422", description = "Update data was not valid. E.g. password violations." ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for update." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
+            @ApiResponse( responseCode = "422", description = "Update data was not valid. E.g. password violations.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for update." ,
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )))
         }
     )
-    User updateUser( @PathParam( "userId" ) String userId, User user )
+    UserInfo updateUser( @PathParam( "userId" ) String userId, User user )
         throws RedbackServiceException;
 
 
@@ -180,18 +197,20 @@ public interface UserService
      */
     @Path( "admin" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
-    @Consumes( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
+    @Consumes( { APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Creates the admin user, if it does not exist",
+    @Operation( summary = "Creates the admin user, if it does not exist",
         responses = {
             @ApiResponse( responseCode = "201",
                 description = "If user creation was successful",
                 headers = {
                     @Header( name="Location", description = "The URL of the created mapping", schema = @Schema(type="string"))
-                }
+                },
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class))
             ),
-            @ApiResponse( responseCode = "422", description = "Invalid input" ),
+            @ApiResponse( responseCode = "422", description = "Invalid input",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
             @ApiResponse( responseCode = "303", description = "The user exists already",
                 headers = {
                     @Header( name="Location", description = "The URL of the existing admin user", schema = @Schema(type="string"))
@@ -199,17 +218,18 @@ public interface UserService
             )
         }
     )
-    User createAdminUser( User user )
+    UserInfo createAdminUser( User user )
         throws RedbackServiceException;
 
     @Path( "admin/status" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns the availability status of the admin user. ",
+    @Operation( summary = "Returns the availability status of the admin user. ",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If status can be retrieved"
+                description = "If status can be retrieved",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = AvailabilityStatus.class))
             )
         }
     )
@@ -222,9 +242,9 @@ public interface UserService
      */
     @Path( "{userId}/lock/set" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Creates a user",
+    @Operation( summary = "Creates a user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
         },
@@ -232,8 +252,10 @@ public interface UserService
             @ApiResponse( responseCode = "200",
                 description = "If locking was successful"
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for locking." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for locking.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  )
         }
     )
     void lockUser( @PathParam( "userId" ) String userId )
@@ -243,9 +265,9 @@ public interface UserService
      */
     @Path( "{userId}/lock/clear" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Unlocks a user",
+    @Operation( summary = "Unlocks a user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
         },
@@ -253,8 +275,10 @@ public interface UserService
             @ApiResponse( responseCode = "200",
                 description = "If unlocking was successful"
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for unlock." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for unlock.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  )
         }
     )
     void unlockUser( @PathParam( "userId" ) String userId )
@@ -265,9 +289,9 @@ public interface UserService
      */
     @Path( "{userId}/password/require/set" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Sets the requirePassword flag for a given user",
+    @Operation( summary = "Sets the requirePassword flag for a given user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
         },
@@ -275,8 +299,10 @@ public interface UserService
             @ApiResponse( responseCode = "200",
                 description = "If password change require flag was set"
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for editing." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for editing.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  )
 
         }
     )
@@ -287,9 +313,9 @@ public interface UserService
      */
     @Path( "{userId}/password/require/clear" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Clears the requirePassword flag for a given user",
+    @Operation( summary = "Clears the requirePassword flag for a given user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
         },
@@ -297,8 +323,10 @@ public interface UserService
             @ApiResponse( responseCode = "200",
                 description = "If password change require flag was unset"
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for editing." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the permission for editing.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  )
 
         }
     )
@@ -309,78 +337,96 @@ public interface UserService
     /**
      * Update only the current logged in user and this fields: fullname, email, password.
      * The service verifies the current logged user with the one passed in the method
-     * @return
+     * @return the user info object
      */
     @Path( "me" )
     @PUT
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Updates information of the current logged in user",
+    @Operation( summary = "Updates information of the current logged in user",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If user data has been updated"
+                description = "The updated user information",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class))
             ),
-            @ApiResponse( responseCode = "401", description = "User is not logged in" ),
-            @ApiResponse( responseCode = "400", description = "Provided data is not valid" )
+            @ApiResponse( responseCode = "401", description = "User is not logged in",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
+            @ApiResponse( responseCode = "400", description = "Provided data is not valid",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  )
         }
     )
-    User updateMe( SelfUserData user )
+    UserInfo updateMe( SelfUserData user )
         throws RedbackServiceException;
 
     @Path( "me" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Gets information of the current logged in user",
-        responses = {
+    @Operation( summary = "Gets information of the current logged in user",
+             responses = {
             @ApiResponse( responseCode = "200",
-                description = "If user data is returned"
+                description = "The user information",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = UserInfo.class))
             ),
-            @ApiResponse( responseCode = "401", description = "User is not logged in" ),
+            @ApiResponse( responseCode = "401", description = "User is not logged in" ,
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
         }
     )
-    User getLoggedInUser( ) throws RedbackServiceException;
+    UserInfo getLoggedInUser( ) throws RedbackServiceException;
 
     @Path( "___ping___" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true )
+    @Operation( summary = "Checks the service availability",
+        responses = {
+            @ApiResponse( responseCode = "200",
+                description = "Pong",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = PingResult.class))
+            )}
+    )
     PingResult ping()
         throws RedbackServiceException;
 
     @Path( "{userId}/cache/clear" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION,
     resource = "{userId}")
-    @io.swagger.v3.oas.annotations.Operation( summary = "Clears the cache for the user",
+    @Operation( summary = "Clears the cache for the user",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_EDIT_OPERATION )
         },
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the cache was cleared properly"
+                description = "Status of the clear operation",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = ActionStatus.class))
+
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "The authenticated user has not the required permission." )
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
+            @ApiResponse( responseCode = "403", description = "The authenticated user has not the required permission.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  )
         }
     )
     ActionStatus removeFromCache( @PathParam( "userId" ) String userId )
         throws RedbackServiceException;
 
     /**
-     * @return
+     * @return the registration key
      */
     @Path( "{userId}/register" )
     @POST
-    @Produces( {MediaType.APPLICATION_JSON} )
+    @Produces( {APPLICATION_JSON} )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Registers a new user",
+    @Operation( summary = "Registers a new user",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the registration was successful, a registration key is returned"
+                description = "If the registration was successful, a registration key is returned",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RegistrationKey.class))
             ),
-            @ApiResponse( responseCode = "422", description = "If the the provided user data is not valid" ),
+            @ApiResponse( responseCode = "422", description = "If the the provided user data is not valid",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
         }
     )
     RegistrationKey registerUser( @PathParam( "userId" ) String userId, UserRegistrationRequest userRegistrationRequest )
@@ -392,15 +438,18 @@ public interface UserService
      */
     @Path( "{userId}/password/reset" )
     @POST
-    @Produces( { MediaType.APPLICATION_JSON } )
-    @Consumes( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
+    @Consumes( { APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Asks for a password reset of the given user. This generates a reset email sent to the stored address of the given user.",
+    @Operation( summary = "Asks for a password reset of the given user. This generates a reset email sent to the stored address of the given user.",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the password reset email was sent"
+                description = "The result status of the password reset.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = ActionStatus.class))
+
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))  ),
         }
     )
     ActionStatus resetPassword( @PathParam( "userId" )String userId )
@@ -410,19 +459,23 @@ public interface UserService
      */
     @Path( "{userId}/permissions" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_VIEW_OPERATION,
         resource = "{userId}")
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns a list of permissions assigned to the given user.",
+    @Operation( summary = "Returns a list of permissions assigned to the given user.",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_VIEW_OPERATION )
         },
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the list could be returned"
+                description = "If the list could be returned",
+                content = @Content(mediaType = APPLICATION_JSON, array = @ArraySchema(schema =
+                    @Schema(implementation = Permission.class)))
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "Logged in user does not have the permission to get this information." ),
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
+            @ApiResponse( responseCode = "403", description = "Logged in user does not have the permission to get this information." ,
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class ))),
         }
     )
     Collection<Permission> getUserPermissions( @PathParam( "userId" ) String userName )
@@ -433,22 +486,26 @@ public interface UserService
      */
     @Path( "{userId}/operations" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( permissions = RedbackRoleConstants.USER_MANAGEMENT_USER_VIEW_OPERATION,
         resource = "{userId}")
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns a list of privileged operations assigned to the given user.",
+    @Operation( summary = "Returns a list of privileged operations assigned to the given user.",
         security = {
             @SecurityRequirement( name = RedbackRoleConstants.USER_MANAGEMENT_USER_VIEW_OPERATION )
         },
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the list could be returned"
+                description = "If the list could be returned",
+                content = @Content(mediaType = APPLICATION_JSON, array = @ArraySchema(schema =
+                @Schema(implementation = org.apache.archiva.redback.rest.api.model.v2.Operation.class )))
             ),
-            @ApiResponse( responseCode = "404", description = "User does not exist" ),
-            @ApiResponse( responseCode = "403", description = "Logged in user does not have the permission to get this information." ),
+            @ApiResponse( responseCode = "404", description = "User does not exist",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
+            @ApiResponse( responseCode = "403", description = "Logged in user does not have the permission to get this information.",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )) ),
         }
     )
-    Collection<Operation> getUserOperations( @PathParam( "userId" ) String userName )
+    Collection<org.apache.archiva.redback.rest.api.model.v2.Operation> getUserOperations( @PathParam( "userId" ) String userName )
         throws RedbackServiceException;
 
     /**
@@ -457,12 +514,14 @@ public interface UserService
      */
     @Path( "me/permissions" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns a list of permissions assigned to the logged in user.",
+    @Operation( summary = "Returns a list of permissions assigned to the logged in user.",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the list could be returned"
+                description = "If the list could be returned",
+                content = @Content(mediaType = APPLICATION_JSON, array = @ArraySchema(schema =
+            @Schema(implementation = Permission.class )))
             )
         }
     )
@@ -475,29 +534,33 @@ public interface UserService
      */
     @Path( "me/operations" )
     @GET
-    @Produces( { MediaType.APPLICATION_JSON } )
+    @Produces( { APPLICATION_JSON } )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Returns a list of privileged operations assigned to the logged in user.",
+    @Operation( summary = "Returns a list of privileged operations assigned to the logged in user.",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the list could be returned"
+                description = "The list of operations assigne to the current user",
+                content = @Content(mediaType = APPLICATION_JSON, array = @ArraySchema(schema =
+                @Schema(implementation = org.apache.archiva.redback.rest.api.model.v2.Operation.class )))
             )
         }
     )
-    Collection<Operation> getCurrentUserOperations( )
+    Collection<org.apache.archiva.redback.rest.api.model.v2.Operation> getCurrentUserOperations( )
         throws RedbackServiceException;
 
 
     @Path( "{userId}/register/{key}/validate" )
     @POST
-    @Produces( {MediaType.APPLICATION_JSON} )
+    @Produces( {APPLICATION_JSON} )
     @RedbackAuthorization( noRestriction = true, noPermission = true )
-    @io.swagger.v3.oas.annotations.Operation( summary = "Validate the user registration for the given userid by checking the provided key.",
+    @Operation( summary = "Validate the user registration for the given userid by checking the provided key.",
         responses = {
             @ApiResponse( responseCode = "200",
-                description = "If the verification was successful"
+                description = "The status of the user registration",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = VerificationStatus.class))
             ),
-            @ApiResponse( responseCode = "404", description = "No user registration was found for the given id and key" )
+            @ApiResponse( responseCode = "404", description = "No user registration was found for the given id and key",
+                content = @Content(mediaType = APPLICATION_JSON, schema = @Schema(implementation = RedbackRestError.class )))
         }
     )
     VerificationStatus validateUserRegistration( @PathParam( "userId" ) String userId, @PathParam( "key" ) String key )
diff --git a/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultAuthenticationService.java b/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultAuthenticationService.java
index d1e262b..d68f4a2 100644
--- a/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultAuthenticationService.java
+++ b/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultAuthenticationService.java
@@ -32,12 +32,11 @@ import org.apache.archiva.redback.policy.MustChangePasswordException;
 import org.apache.archiva.redback.rest.api.MessageKeys;
 import org.apache.archiva.redback.rest.api.model.ErrorMessage;
 import org.apache.archiva.redback.rest.api.model.GrantType;
-import org.apache.archiva.redback.rest.api.model.v2.TokenResponse;
-import org.apache.archiva.redback.rest.api.model.User;
-import org.apache.archiva.redback.rest.api.model.UserLogin;
 import org.apache.archiva.redback.rest.api.model.v2.PingResult;
 import org.apache.archiva.redback.rest.api.model.v2.TokenRefreshRequest;
 import org.apache.archiva.redback.rest.api.model.v2.TokenRequest;
+import org.apache.archiva.redback.rest.api.model.v2.TokenResponse;
+import org.apache.archiva.redback.rest.api.model.v2.UserInfo;
 import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
 import org.apache.archiva.redback.rest.api.services.v2.AuthenticationService;
 import org.apache.archiva.redback.rest.services.interceptors.RedbackPrincipal;
@@ -225,7 +224,7 @@ public class DefaultAuthenticationService
     }
 
     @Override
-    public User getAuthenticatedUser()
+    public UserInfo getAuthenticatedUser()
         throws RedbackServiceException
     {
         RedbackPrincipal pri = getPrincipal( );
@@ -237,11 +236,11 @@ public class DefaultAuthenticationService
         }
     }
 
-    private UserLogin buildRestUser( org.apache.archiva.redback.users.User user )
+    private UserInfo buildRestUser( org.apache.archiva.redback.users.User user )
     {
-        UserLogin restUser = new UserLogin();
+        UserInfo restUser = new UserInfo();
         restUser.setEmail( user.getEmail() );
-        restUser.setUsername( user.getUsername() );
+        restUser.setUserId( user.getUsername() );
         restUser.setPasswordChangeRequired( user.isPasswordChangeRequired() );
         restUser.setLocked( user.isLocked() );
         restUser.setValidated( user.isValidated() );
diff --git a/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultUserService.java b/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultUserService.java
index fbf2c88..2051c6f 100644
--- a/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultUserService.java
+++ b/redback-integrations/redback-rest/redback-rest-services/src/main/java/org/apache/archiva/redback/rest/services/v2/DefaultUserService.java
@@ -46,15 +46,16 @@ import org.apache.archiva.redback.rest.api.MessageKeys;
 import org.apache.archiva.redback.rest.api.model.ActionStatus;
 import org.apache.archiva.redback.rest.api.model.v2.AvailabilityStatus;
 import org.apache.archiva.redback.rest.api.model.ErrorMessage;
-import org.apache.archiva.redback.rest.api.model.Operation;
-import org.apache.archiva.redback.rest.api.model.Permission;
+import org.apache.archiva.redback.rest.api.model.v2.Operation;
+import org.apache.archiva.redback.rest.api.model.v2.Permission;
 import org.apache.archiva.redback.rest.api.model.v2.SelfUserData;
 import org.apache.archiva.redback.rest.api.model.v2.RegistrationKey;
-import org.apache.archiva.redback.rest.api.model.Resource;
-import org.apache.archiva.redback.rest.api.model.VerificationStatus;
+import org.apache.archiva.redback.rest.api.model.v2.Resource;
+import org.apache.archiva.redback.rest.api.model.v2.VerificationStatus;
 import org.apache.archiva.redback.rest.api.model.v2.PagedResult;
 import org.apache.archiva.redback.rest.api.model.v2.PingResult;
 import org.apache.archiva.redback.rest.api.model.v2.User;
+import org.apache.archiva.redback.rest.api.model.v2.UserInfo;
 import org.apache.archiva.redback.rest.api.model.v2.UserRegistrationRequest;
 import org.apache.archiva.redback.rest.api.services.RedbackServiceException;
 import org.apache.archiva.redback.rest.api.services.v2.UserService;
@@ -182,10 +183,10 @@ public class DefaultUserService
     }
 
     @Override
-    public User createUser( User user )
+    public UserInfo createUser( User user )
         throws RedbackServiceException
     {
-        User result;
+        UserInfo result;
         if ( Arrays.binarySearch( INVALID_CREATE_USER_NAMES, user.getUserId( ) ) >=0 )
         {
             throw new RedbackServiceException( ErrorMessage.of( MessageKeys.ERR_USER_ID_INVALID, user.getUserId() ), 422 );
@@ -311,7 +312,7 @@ public class DefaultUserService
 
 
     @Override
-    public User getUser( String userId )
+    public UserInfo getUser( String userId )
         throws RedbackServiceException
     {
         try
@@ -333,7 +334,7 @@ public class DefaultUserService
     }
 
     @Override
-    public PagedResult<User> getUsers(Integer offset,
+    public PagedResult<UserInfo> getUsers(Integer offset,
                                       Integer limit)
         throws RedbackServiceException
     {
@@ -345,7 +346,7 @@ public class DefaultUserService
             }
             int endIndex = PagingHelper.getLastIndex( offset, limit, users.size( ) );
             List<? extends org.apache.archiva.redback.users.User> resultList = users.subList( offset, endIndex );
-            List<User> simpleUsers = new ArrayList<>( resultList.size() );
+            List<UserInfo> simpleUsers = new ArrayList<>( resultList.size() );
 
             for ( org.apache.archiva.redback.users.User user : resultList )
             {
@@ -360,7 +361,7 @@ public class DefaultUserService
     }
 
     @Override
-    public User updateMe( SelfUserData user )
+    public UserInfo updateMe( SelfUserData user )
         throws RedbackServiceException
     {
         RedbackPrincipal principal = getPrincipal( );
@@ -422,7 +423,7 @@ public class DefaultUserService
     }
 
     @Override
-    public User getLoggedInUser(  )
+    public UserInfo getLoggedInUser(  )
         throws RedbackServiceException
     {
         RedbackPrincipal principal = getPrincipal( );
@@ -442,7 +443,7 @@ public class DefaultUserService
     }
 
     @Override
-    public User updateUser( String userId,  User user )
+    public UserInfo updateUser( String userId,  User user )
         throws RedbackServiceException
     {
         try
@@ -513,20 +514,20 @@ public class DefaultUserService
         return new PingResult( true );
     }
 
-    private User getRestUser( org.apache.archiva.redback.users.User user )
+    private UserInfo getRestUser( org.apache.archiva.redback.users.User user )
     {
         if ( user == null )
         {
             return null;
         }
-        return new User( user );
+        return new UserInfo( user );
     }
 
     @Override
-    public User createAdminUser( User adminUser )
+    public UserInfo createAdminUser( User adminUser )
         throws RedbackServiceException
     {
-        User result;
+        UserInfo result;
         if ( getAdminStatus().isExists() )
         {
             log.warn( "Admin user exists already" );
diff --git a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeAuthenticationServiceTest.java b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeAuthenticationServiceTest.java
index c9c6327..48ebab5 100644
--- a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeAuthenticationServiceTest.java
+++ b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/NativeAuthenticationServiceTest.java
@@ -178,7 +178,7 @@ public class NativeAuthenticationServiceTest extends AbstractNativeRestServices
             .when( ).get( "/authenticated" ).then( ).statusCode( 200 )
             .extract( ).response( );
         System.out.println( result.getBody( ).prettyPrint( ) );
-        assertEquals( "admin", result.getBody( ).jsonPath( ).getString( "username" ) );
+        assertEquals( "admin", result.getBody( ).jsonPath( ).getString( "user_id" ) );
 
     }
 
diff --git a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/UserServiceTest.java b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/UserServiceTest.java
index 3bafe1e..099cab1 100644
--- a/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/UserServiceTest.java
+++ b/redback-integrations/redback-rest/redback-rest-services/src/test/java/org/apache/archiva/redback/rest/services/v2/UserServiceTest.java
@@ -20,14 +20,15 @@ package org.apache.archiva.redback.rest.services.v2;
  */
 
 import org.apache.archiva.redback.rest.api.model.GrantType;
-import org.apache.archiva.redback.rest.api.model.Operation;
+import org.apache.archiva.redback.rest.api.model.v2.Operation;
 import org.apache.archiva.redback.rest.api.model.v2.SelfUserData;
 import org.apache.archiva.redback.rest.api.model.v2.PagedResult;
-import org.apache.archiva.redback.rest.api.model.Permission;
+import org.apache.archiva.redback.rest.api.model.v2.Permission;
 import org.apache.archiva.redback.rest.api.model.v2.PingResult;
 import org.apache.archiva.redback.rest.api.model.v2.TokenRequest;
 import org.apache.archiva.redback.rest.api.model.v2.TokenResponse;
 import org.apache.archiva.redback.rest.api.model.v2.User;
+import org.apache.archiva.redback.rest.api.model.v2.UserInfo;
 import org.apache.archiva.redback.rest.api.model.v2.UserRegistrationRequest;
 import org.apache.archiva.redback.rest.api.services.v2.UserService;
 import org.apache.archiva.redback.rest.services.FakeCreateAdminService;
@@ -122,7 +123,7 @@ public class UserServiceTest
     {
         String adminHeader = getAdminAuthzHeader( );
         UserService userService = getUserService( adminHeader );
-        PagedResult<org.apache.archiva.redback.rest.api.model.v2.User> users = userService.getUsers( 0, Integer.MAX_VALUE );
+        PagedResult<org.apache.archiva.redback.rest.api.model.v2.UserInfo> users = userService.getUsers( 0, Integer.MAX_VALUE );
         assertNotNull( users );
         assertFalse( users.getData().isEmpty( ) );
     }
@@ -225,11 +226,11 @@ public class UserServiceTest
 
             service = getUserService( getAdminAuthzHeader( ) );
 
-            u = service.getUser( "toto" );
+            UserInfo uInfo = service.getUser( "toto" );
 
-            assertNotNull( u );
-            assertFalse( u.isValidated( ) );
-            assertTrue( u.isPasswordChangeRequired( ) );
+            assertNotNull( uInfo );
+            assertFalse( uInfo.isValidated( ) );
+            assertTrue( uInfo.isPasswordChangeRequired( ) );
 
             // assertTrue( service.validateUserFromKey( key ).isSuccess( ) );
 
@@ -287,11 +288,11 @@ public class UserServiceTest
 
             service = getUserService( getAdminAuthzHeader( ) );
 
-            u = service.getUser( "toto" );
+            UserInfo uInfo = service.getUser( "toto" );
 
-            assertNotNull( u );
-            assertTrue( u.isValidated( ) );
-            assertTrue( u.isPasswordChangeRequired( ) );
+            assertNotNull( uInfo );
+            assertTrue( uInfo.isValidated( ) );
+            assertTrue( uInfo.isPasswordChangeRequired( ) );
 
             // assertTrue( service.validateUserFromKey( key ).isSuccess( ) );
 
@@ -349,11 +350,11 @@ public class UserServiceTest
 
             service = getUserService( getAdminAuthzHeader( ) );
 
-            u = service.getUser( "toto" );
+            UserInfo uInfo = service.getUser( "toto" );
 
-            assertNotNull( u );
-            assertFalse( u.isValidated( ) );
-            assertTrue( u.isPasswordChangeRequired( ) );
+            assertNotNull( uInfo );
+            assertFalse( uInfo.isValidated( ) );
+            assertTrue( uInfo.isPasswordChangeRequired( ) );
 
             // assertTrue( service.validateUserFromKey( key ).isSuccess( ) );
 
@@ -410,11 +411,11 @@ public class UserServiceTest
 
             service = getUserService( getAdminAuthzHeader( ) );
 
-            u = service.getUser( "toto" );
+            UserInfo uInfo = service.getUser( "toto" );
 
-            assertNotNull( u );
-            assertFalse( u.isValidated( ) );
-            assertTrue( u.isPasswordChangeRequired( ) );
+            assertNotNull( uInfo );
+            assertFalse( uInfo.isValidated( ) );
+            assertTrue( uInfo.isPasswordChangeRequired( ) );
 
             // assertTrue( service.validateUserFromKey( key ).isSuccess( ) );
 
@@ -511,9 +512,9 @@ public class UserServiceTest
         selfUserData.setCurrentPassword( "toto123" );
         getUserService( getUserAuthzHeader( "toto" ) ).updateMe( selfUserData );
 
-        u = getUserService( getAdminAuthzHeader( ) ).getUser( "toto" );
-        assertEquals( "the toto123", u.getFullName( ) );
-        assertEquals( "toto@titi.fr", u.getEmail( ) );
+        UserInfo uInfo = getUserService( getAdminAuthzHeader( ) ).getUser( "toto" );
+        assertEquals( "the toto123", uInfo.getFullName( ) );
+        assertEquals( "toto@titi.fr", uInfo.getEmail( ) );
 
         selfUserData.setFullName( "the toto1234" );
         selfUserData.setEmail( "toto@tititi.fr" );
@@ -521,9 +522,9 @@ public class UserServiceTest
         selfUserData.setCurrentPassword( "toto1234" );
         getUserService( getUserAuthzHeader( "toto" )) .updateMe( selfUserData );
 
-        u = getUserService( getAdminAuthzHeader( ) ).getUser( "toto" );
-        assertEquals( "the toto1234", u.getFullName( ) );
-        assertEquals( "toto@tititi.fr", u.getEmail( ) );
+        uInfo = getUserService( getAdminAuthzHeader( ) ).getUser( "toto" );
+        assertEquals( "the toto1234", uInfo.getFullName( ) );
+        assertEquals( "toto@tititi.fr", uInfo.getEmail( ) );
 
         getUserService( getAdminAuthzHeader( ) ).deleteUser( "toto" );
     }
@@ -545,10 +546,10 @@ public class UserServiceTest
             UserService userService = getUserService( getAdminAuthzHeader( ) );
             userService.createUser( user );
             // END SNIPPET: create-user
-            user = userService.getUser( "toto" );
-            assertNotNull( user );
-            assertEquals( "toto the king", user.getFullName( ) );
-            assertEquals( "toto@toto.fr", user.getEmail( ) );
+            UserInfo userInfo = userService.getUser( "toto" );
+            assertNotNull( userInfo );
+            assertEquals( "toto the king", userInfo.getFullName( ) );
+            assertEquals( "toto@toto.fr", userInfo.getEmail( ) );
             TokenResponse result = getLoginServiceV2( null ).logIn( new TokenRequest( "toto", "foo123", GrantType.AUTHORIZATION_CODE ) );
             getLoginServiceV2( "Bearer " + result.getAccessToken( ) ).pingWithAutz( );