diff --git a/pom.xml b/pom.xml
index 48117ada8f9889de5161701385be6cd7e5556eb7..16baeed81627c1f0038943968927bfb5bc0b2882 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,11 @@
 	<groupId>it.sauronsoftware.cron4j</groupId>
 	<artifactId>cron4j</artifactId>
 	<version>2.2.5</version>
+</dependency>
+<dependency>
+    <groupId>org.openid4java</groupId>
+    <artifactId>openid4java</artifactId>
+    <version>0.9.8</version>
 </dependency>
   </dependencies>
 
diff --git a/src/main/java/no/bioforsk/vips/logic/authenticate/AuthenticationFilter.java b/src/main/java/no/bioforsk/vips/logic/authenticate/AuthenticationFilter.java
index e8fde3b4b6a89132da034f82173d3c64c7d84923..5e89934a399dc16ed1d1ed488620804d5891699f 100644
--- a/src/main/java/no/bioforsk/vips/logic/authenticate/AuthenticationFilter.java
+++ b/src/main/java/no/bioforsk/vips/logic/authenticate/AuthenticationFilter.java
@@ -6,6 +6,7 @@ import java.net.URLEncoder;
 import javax.servlet.*;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import no.bioforsk.vips.logic.entity.VipsLogicUser;
 import no.bioforsk.vips.logic.util.Globals;
 import no.bioforsk.vips.util.ServletUtil;
 
@@ -34,11 +35,11 @@ public class AuthenticationFilter implements Filter{
         }
         else
         {
-            boolean redirectToLogin = httpRequest.getSession().getAttribute("user") == null;
+            boolean redirectToLogin = (httpRequest.getSession().getAttribute("user") == null || !( httpRequest.getSession().getAttribute("user")  instanceof VipsLogicUser));
             if(redirectToLogin)
             {
                 String nextPageDirective = "";
-                if(!httpRequest.getServletPath().equals("/login"));
+                if(!httpRequest.getServletPath().equals("/login"))
                 {
                     String nextPage = ServletUtil.getFullRequestURI(httpRequest);
                     nextPageDirective= "?nextPage=" + URLEncoder.encode(nextPage, "UTF-8");
diff --git a/src/main/java/no/bioforsk/vips/logic/authenticate/OpenIdAuthAttributes.java b/src/main/java/no/bioforsk/vips/logic/authenticate/OpenIdAuthAttributes.java
new file mode 100644
index 0000000000000000000000000000000000000000..b167e5bbd4328d480cb9d16408eeba778fcac158
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/authenticate/OpenIdAuthAttributes.java
@@ -0,0 +1,96 @@
+package no.bioforsk.vips.logic.authenticate;
+
+/**
+ * Contains information from an authentication session with an openId provider
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+public class OpenIdAuthAttributes {
+    
+    private String email, firstName, lastName, fullName, countryCode, openId;
+
+    /**
+     * @return the email
+     */
+    public String getEmail() {
+        return email;
+    }
+
+    /**
+     * @param email the email to set
+     */
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    /**
+     * @return the firstName
+     */
+    public String getFirstName() {
+        return firstName;
+    }
+
+    /**
+     * @param firstName the firstName to set
+     */
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    /**
+     * @return the lastName
+     */
+    public String getLastName() {
+        return lastName;
+    }
+
+    /**
+     * @param lastName the lastName to set
+     */
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    /**
+     * @return the fullName
+     */
+    public String getFullName() {
+        return fullName;
+    }
+
+    /**
+     * @param fullName the fullName to set
+     */
+    public void setFullName(String fullName) {
+        this.fullName = fullName;
+    }
+
+    /**
+     * @return the countryCode
+     */
+    public String getCountryCode() {
+        return countryCode;
+    }
+
+    /**
+     * @param countryCode the countryCode to set
+     */
+    public void setCountryCode(String countryCode) {
+        this.countryCode = countryCode;
+    }
+
+    /**
+     * @return the openId
+     */
+    public String getOpenId() {
+        return openId;
+    }
+
+    /**
+     * @param openId the openId to set
+     */
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/authenticate/OpenIdRelyingParty.java b/src/main/java/no/bioforsk/vips/logic/authenticate/OpenIdRelyingParty.java
new file mode 100644
index 0000000000000000000000000000000000000000..e2df4f2b1dfd9dd598d52c9718602e623a7886a2
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/authenticate/OpenIdRelyingParty.java
@@ -0,0 +1,242 @@
+package no.bioforsk.vips.logic.authenticate;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.Set;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import no.bioforsk.vips.util.ServletUtil;
+import org.openid4java.OpenIDException;
+import org.openid4java.consumer.ConsumerException;
+import org.openid4java.consumer.ConsumerManager;
+import org.openid4java.consumer.InMemoryConsumerAssociationStore;
+import org.openid4java.consumer.InMemoryNonceVerifier;
+import org.openid4java.consumer.VerificationResult;
+import org.openid4java.discovery.DiscoveryInformation;
+import org.openid4java.discovery.Identifier;
+import org.openid4java.message.AuthRequest;
+import org.openid4java.message.AuthSuccess;
+import org.openid4java.message.MessageException;
+import org.openid4java.message.MessageExtension;
+import org.openid4java.message.ParameterList;
+import org.openid4java.message.ax.AxMessage;
+import org.openid4java.message.ax.FetchRequest;
+import org.openid4java.message.ax.FetchResponse;
+import org.openid4java.message.sreg.SRegMessage;
+import org.openid4java.message.sreg.SRegRequest;
+import org.openid4java.message.sreg.SRegResponse;
+
+/**
+ * Contains all methods needed to perform authenticating sessions with OpenId
+ * Resources:
+ * <ul>
+ *  <li>Attributes: http://openid.net/specs/openid-attribute-properties-list-1_0-01.html</li>
+ * </ul>
+ * Relies on OpenId4Java.
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+public class OpenIdRelyingParty {
+    private static ConsumerManager consumerManager;
+
+    public OpenIdRelyingParty() throws ConsumerException
+    {
+        // instantiate a ConsumerManager object
+        consumerManager = new ConsumerManager();
+    }
+    
+    private static ConsumerManager getConsumerManager()
+    {
+        if (consumerManager == null) {
+                consumerManager = new ConsumerManager();
+                consumerManager.setAssociations(new InMemoryConsumerAssociationStore());
+                consumerManager.setNonceVerifier(new InMemoryNonceVerifier(10000));
+        }
+        return consumerManager;
+    }
+
+    // --- placing the authentication request for first time registration ---
+    public String authRequest(String userSuppliedString,
+                              HttpServletRequest httpReq,
+                              HttpServletResponse httpResp)
+            throws IOException
+    {
+        try
+        {
+            // Overriding, using Google
+            //userSuppliedString = "https://www.google.com/accounts/o8/id";
+            // configure the return_to URL where your application will receive
+            // the authentication responses from the OpenID provider
+            String returnToUrl = "http://vipslogic/test/testloginsuccess.jsp";
+
+            // --- Forward proxy setup (only if needed) ---
+            // ProxyProperties proxyProps = new ProxyProperties();
+            // proxyProps.setProxyName("proxy.example.com");
+            // proxyProps.setProxyPort(8080);
+            // HttpClientFactory.setProxyProperties(proxyProps);
+
+            
+            
+            // perform discovery on the user-supplied identifier
+            // The list is a list of DiscoveryInformation objects
+            List discoveries = getConsumerManager().discover(userSuppliedString);
+
+            // attempt to associate with the OpenID provider
+            // and retrieve one service endpoint for authentication
+            DiscoveryInformation discovered = getConsumerManager().associate(discoveries);
+            
+            System.out.println("DiscoveryInformation=" + discovered.toString());
+            
+            Set types = discovered.getTypes();
+            for(Object type : types)
+            {
+                System.out.println("Type=####" + type.toString() + " \n[" + type.getClass().getName() + "]\n####");
+            }
+
+            // store the discovery information in the user's session
+            httpReq.getSession().setAttribute("openid-disc", discovered);
+
+            // obtain a AuthRequest message to be sent to the OpenID provider
+            AuthRequest authReq = getConsumerManager().authenticate(discovered, returnToUrl);
+            authReq.setHandle("");
+            
+            /**
+             * OpenId Providers are VERY diverse when it comes to attributes
+             * We attempt to get email address (and other attributes) in diverse ways
+             */
+
+            // This works with Symantec Personal Identity Portal
+            SRegRequest sRegRequest = SRegRequest.createFetchRequest();
+            sRegRequest.addAttribute("email", true);
+            // attach the extension to the authentication request
+            authReq.addExtension(sRegRequest);
+            
+            // This works with Google
+            FetchRequest fetch = FetchRequest.createFetchRequest();
+            fetch.addAttribute("email1","http://openid.net/schema/contact/internet/email", true);                                      // required
+            fetch.addAttribute("email2", "http://schema.openid.net/contact/email", true);
+            fetch.addAttribute("email3", "http://axschema.org/contact/email", true);
+            // attach the extension to the authentication request
+            authReq.addExtension(fetch);
+
+            httpResp.sendRedirect(authReq.getDestinationUrl(true));
+            return null;
+        }
+        catch (OpenIDException e)
+        {
+            // present error to the user
+        }
+
+        return null;
+    }
+
+    // --- processing the authentication response ---
+    public OpenIdAuthAttributes verifyResponse(HttpServletRequest httpReq)
+    {
+        try
+        {
+            
+            // extract the parameters from the authentication response
+            // (which comes in as a HTTP request from the OpenID provider)
+            ParameterList response =
+                    new ParameterList(httpReq.getParameterMap());
+
+            // retrieve the previously stored discovery information
+            DiscoveryInformation discovered = (DiscoveryInformation)
+                    httpReq.getSession().getAttribute("openid-disc");
+            System.out.println("discovered = " + discovered.toString());
+
+            // verify the response; ConsumerManager needs to be the same
+            // (static) instance used to place the authentication request
+            VerificationResult verification = getConsumerManager().verify(
+                    ServletUtil.getCompleteRequestURL(httpReq),
+                    response, discovered);
+
+            System.out.println("Verification finished. Verification = " + verification.toString());
+            
+            // examine the verification result and extract the verified identifier
+            Identifier verified = verification.getVerifiedId();
+            if (verified != null)
+            {
+                System.out.println("Verified = " + verified.getIdentifier());
+                
+                AuthSuccess authSuccess =
+                        (AuthSuccess) verification.getAuthResponse();
+                
+                OpenIdAuthAttributes attributes = this.getOpenIdAuthAttributes(verified.getIdentifier(), authSuccess);
+
+                
+
+                return attributes;  // success
+            }
+        }
+        catch (OpenIDException e)
+        {
+            e.printStackTrace();// present error to the user
+        }
+
+        return null;
+    }
+    
+    private OpenIdAuthAttributes getOpenIdAuthAttributes(String identifier, AuthSuccess authSuccess) throws MessageException
+    {
+        OpenIdAuthAttributes retVal = new OpenIdAuthAttributes();
+        retVal.setOpenId(identifier);
+        if (authSuccess.hasExtension(SRegMessage.OPENID_NS_SREG))
+        {
+            MessageExtension extension = authSuccess.getExtension(SRegMessage.OPENID_NS_SREG);
+            if(extension instanceof SRegResponse)
+            {
+                SRegResponse sRegResponse = (SRegResponse) extension;
+                String value = sRegResponse.getAttributeValue("email");
+                if(value !=  null)
+                {
+                    retVal.setEmail(value);
+                }
+                value = sRegResponse.getAttributeValue("firstname");
+                if(value != null)
+                {
+                    retVal.setFirstName(value);
+                }
+                value = sRegResponse.getAttributeValue("lastname");
+                if(value != null)
+                {
+                    retVal.setLastName(value);
+                }
+                value = sRegResponse.getAttributeValue("fullname");
+                if(value != null)
+                {
+                    retVal.setFullName(value);
+                }
+                value = sRegResponse.getAttributeValue("countrycode");
+                if(value != null)
+                {
+                    retVal.setCountryCode(value);
+                }
+            }
+
+        }
+        else if (authSuccess.hasExtension(AxMessage.OPENID_NS_AX))
+        {
+            FetchResponse fetchResp = (FetchResponse) authSuccess
+                    .getExtension(AxMessage.OPENID_NS_AX);
+
+            //String emails = fetchResp.getAttributeValues("email1");
+            String email = fetchResp.getAttributeValue("email1");
+            if(email ==  null)
+            {
+                email = fetchResp.getAttributeValue("email2");
+            }
+            if(email == null)
+            {
+                email = fetchResp.getAttributeValue("email3");
+            }
+            retVal.setEmail(email);
+        }
+
+        
+        return retVal;
+    }
+
+}
+
diff --git a/src/main/java/no/bioforsk/vips/logic/controller/LoginController.java b/src/main/java/no/bioforsk/vips/logic/controller/LoginController.java
index f84d83eb870ac0445e4c4c3f1fe1395669f883cb..32b05a0cc479b56ec8641b7d38fb9cc8070d3402 100644
--- a/src/main/java/no/bioforsk/vips/logic/controller/LoginController.java
+++ b/src/main/java/no/bioforsk/vips/logic/controller/LoginController.java
@@ -14,7 +14,7 @@ import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
 import no.bioforsk.vips.coremanager.service.ManagerResource;
-import no.bioforsk.vips.logic.entity.UserVipslogicRole;
+import no.bioforsk.vips.logic.entity.VipsLogicUser;
 import no.bioforsk.vips.logic.session.SessionControllerGetter;
 import no.bioforsk.vips.util.ServletUtil;
 import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;
@@ -67,28 +67,19 @@ public class LoginController extends HttpServlet {
                 creds.put("username", username);
                 creds.put("password", password);
 
-                Response resp = this.getManagerResource().getUserInfo(creds);
-                if(resp.getStatus() == Response.Status.OK.getStatusCode())
+                VipsLogicUser user = SessionControllerGetter.getUserBean().authenticateUser(creds);
+
+                if(user != null)
                 {
-                    Map user = resp.readEntity(HashMap.class);
-                    if(user != null)
-                    {
-                        List<UserVipslogicRole> roles = SessionControllerGetter.getUserBean().getUserVipslogicRole((Integer)user.get("vipsCoreUserId"));
-                        user.put("roles", roles);
-                        request.getSession().setAttribute("user", user);
-                        response.sendRedirect(new StringBuilder("http://").append(ServletUtil.getServerName(request)).append(nextPage).toString());
-                    }
-                    else
-                    {
-                        request.setAttribute("errorMessageKey", "invalidcredentials");
-                        request.getRequestDispatcher("/login.ftl").forward(request, response);
-                    }
+                    request.getSession().setAttribute("user", user);
+                    response.sendRedirect(new StringBuilder("http://").append(ServletUtil.getServerName(request)).append(nextPage).toString());
                 }
                 else
                 {
                     request.setAttribute("errorMessageKey", "invalidcredentials");
                     request.getRequestDispatcher("/login.ftl").forward(request, response);
                 }
+                
 
             }
         }
diff --git a/src/main/java/no/bioforsk/vips/logic/controller/PointOfInterestController.java b/src/main/java/no/bioforsk/vips/logic/controller/PointOfInterestController.java
index b45a2be25e3a9873336eb319a200f88a21e7a149..90c6137584b54d7f3424c3ac40eb0a34ed3a4d16 100644
--- a/src/main/java/no/bioforsk/vips/logic/controller/PointOfInterestController.java
+++ b/src/main/java/no/bioforsk/vips/logic/controller/PointOfInterestController.java
@@ -2,7 +2,6 @@ package no.bioforsk.vips.logic.controller;
 
 import java.io.IOException;
 import java.util.List;
-import java.util.Map;
 import java.util.TimeZone;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
@@ -10,6 +9,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import no.bioforsk.vips.logic.entity.PointOfInterest;
 import no.bioforsk.vips.logic.entity.PointOfInterestWeatherStation;
+import no.bioforsk.vips.logic.entity.VipsLogicUser;
 import no.bioforsk.vips.logic.session.SessionControllerGetter;
 
 /**
@@ -35,8 +35,7 @@ public class PointOfInterestController extends HttpServlet {
         request.getSession().removeAttribute("weatherStations");
         request.getSession().removeAttribute("weatherStation");
         
-        Map userInfo = (Map) request.getSession().getAttribute("user");
-        Integer userId = (Integer) userInfo.get("vipsCoreUserId");
+        VipsLogicUser user = (VipsLogicUser) request.getSession().getAttribute("user");
         
         /*
         System.out.println("PathInfo=" + request.getPathInfo());
@@ -54,12 +53,12 @@ public class PointOfInterestController extends HttpServlet {
             if(pointOfInterestId == null)
             {
                 List<PointOfInterestWeatherStation> weatherStations;
-                if(SessionControllerGetter.getUserBean().isSuperUser(userInfo)){
+                if(user.isSuperUser()){
                     weatherStations = SessionControllerGetter.getPointOfInterestBean().getAllWeatherStations();
                 }
                 else
                 {
-                    weatherStations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForUser(userId);
+                    weatherStations = SessionControllerGetter.getPointOfInterestBean().getWeatherstationsForUser(user.getUserId());
                 }
                 request.getSession().setAttribute("weatherStations", weatherStations);
                 request.getRequestDispatcher("/weatherstationlist.ftl").forward(request, response);
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/Organization.java b/src/main/java/no/bioforsk/vips/logic/entity/Organization.java
new file mode 100644
index 0000000000000000000000000000000000000000..59cdacb43129f34eec8255051af69b788e31e1ae
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/entity/Organization.java
@@ -0,0 +1,180 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package no.bioforsk.vips.logic.entity;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+/**
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Entity
+@Table(name = "organization")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "Organization.findAll", query = "SELECT o FROM Organization o"),
+    @NamedQuery(name = "Organization.findByOrganizationId", query = "SELECT o FROM Organization o WHERE o.organizationId = :organizationId"),
+    @NamedQuery(name = "Organization.findByOrganizationName", query = "SELECT o FROM Organization o WHERE o.organizationName = :organizationName"),
+    @NamedQuery(name = "Organization.findByAddress1", query = "SELECT o FROM Organization o WHERE o.address1 = :address1"),
+    @NamedQuery(name = "Organization.findByAddress2", query = "SELECT o FROM Organization o WHERE o.address2 = :address2"),
+    @NamedQuery(name = "Organization.findByPostalCode", query = "SELECT o FROM Organization o WHERE o.postalCode = :postalCode")})
+public class Organization implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    @Column(name = "organization_id")
+    private Integer organizationId;
+    @Size(max = 255)
+    @Column(name = "organization_name")
+    private String organizationName;
+    @Size(max = 255)
+    @Column(name = "address1")
+    private String address1;
+    @Size(max = 255)
+    @Column(name = "address2")
+    private String address2;
+    @Size(max = 63)
+    @Column(name = "postal_code")
+    private String postalCode;
+    @OneToMany(mappedBy = "parentOrganizationId")
+    private Set<Organization> organizationSet;
+    @JoinColumn(name = "parent_organization_id", referencedColumnName = "organization_id")
+    @ManyToOne
+    private Organization parentOrganizationId;
+    @JoinColumn(name = "country_code", referencedColumnName = "country_code")
+    @ManyToOne
+    private Country countryCode;
+    @OneToMany(mappedBy = "organizationId")
+    private Set<VipsLogicUser> vipsLogicUserSet;
+
+    public Organization() {
+    }
+
+    public Organization(Integer organizationId) {
+        this.organizationId = organizationId;
+    }
+
+    public Integer getOrganizationId() {
+        return organizationId;
+    }
+
+    public void setOrganizationId(Integer organizationId) {
+        this.organizationId = organizationId;
+    }
+
+    public String getOrganizationName() {
+        return organizationName;
+    }
+
+    public void setOrganizationName(String organizationName) {
+        this.organizationName = organizationName;
+    }
+
+    public String getAddress1() {
+        return address1;
+    }
+
+    public void setAddress1(String address1) {
+        this.address1 = address1;
+    }
+
+    public String getAddress2() {
+        return address2;
+    }
+
+    public void setAddress2(String address2) {
+        this.address2 = address2;
+    }
+
+    public String getPostalCode() {
+        return postalCode;
+    }
+
+    public void setPostalCode(String postalCode) {
+        this.postalCode = postalCode;
+    }
+
+    @XmlTransient
+    @JsonIgnore
+    public Set<Organization> getOrganizationSet() {
+        return organizationSet;
+    }
+
+    public void setOrganizationSet(Set<Organization> organizationSet) {
+        this.organizationSet = organizationSet;
+    }
+
+    public Organization getParentOrganizationId() {
+        return parentOrganizationId;
+    }
+
+    public void setParentOrganizationId(Organization parentOrganizationId) {
+        this.parentOrganizationId = parentOrganizationId;
+    }
+
+    public Country getCountryCode() {
+        return countryCode;
+    }
+
+    public void setCountryCode(Country countryCode) {
+        this.countryCode = countryCode;
+    }
+
+    @XmlTransient
+    @JsonIgnore
+    public Set<VipsLogicUser> getVipsLogicUserSet() {
+        return vipsLogicUserSet;
+    }
+
+    public void setVipsLogicUserSet(Set<VipsLogicUser> vipsLogicUserSet) {
+        this.vipsLogicUserSet = vipsLogicUserSet;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (organizationId != null ? organizationId.hashCode() : 0);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof Organization)) {
+            return false;
+        }
+        Organization other = (Organization) object;
+        if ((this.organizationId == null && other.organizationId != null) || (this.organizationId != null && !this.organizationId.equals(other.organizationId))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "no.bioforsk.vips.logic.entity.Organization[ organizationId=" + organizationId + " ]";
+    }
+
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/UserAuthentication.java b/src/main/java/no/bioforsk/vips/logic/entity/UserAuthentication.java
new file mode 100644
index 0000000000000000000000000000000000000000..cad2441aba855a712e12dfcd6daf868ad7031623
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/entity/UserAuthentication.java
@@ -0,0 +1,128 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package no.bioforsk.vips.logic.entity;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Entity
+@Table(name = "user_authentication")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserAuthentication.findAll", query = "SELECT u FROM UserAuthentication u"),
+    @NamedQuery(name = "UserAuthentication.findByUserId", query = "SELECT u FROM UserAuthentication u WHERE u.userAuthenticationPK.userId = :userId"),
+    @NamedQuery(name = "UserAuthentication.findByUserAuthenticationTypeId", query = "SELECT u FROM UserAuthentication u WHERE u.userAuthenticationPK.userAuthenticationTypeId = :userAuthenticationTypeId"),
+    @NamedQuery(name = "UserAuthentication.findByUsername", query = "SELECT u FROM UserAuthentication u WHERE u.username = :username"),
+    @NamedQuery(name = "UserAuthentication.findByUsernameAndPassword", query = "SELECT u FROM UserAuthentication u WHERE u.username = :username AND u.password = :password"),
+    @NamedQuery(name = "UserAuthentication.findByPassword", query = "SELECT u FROM UserAuthentication u WHERE u.password = :password")})
+public class UserAuthentication implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @EmbeddedId
+    protected UserAuthenticationPK userAuthenticationPK;
+    @Size(max = 2047)
+    @Column(name = "username")
+    private String username;
+    @Size(max = 63)
+    @Column(name = "password")
+    private String password;
+    @JoinColumn(name = "user_id", referencedColumnName = "user_id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private VipsLogicUser vipsLogicUser;
+    @JoinColumn(name = "user_authentication_type_id", referencedColumnName = "user_authentication_type_id", insertable = false, updatable = false)
+    @ManyToOne(optional = false)
+    private UserAuthenticationType userAuthenticationType;
+
+    public UserAuthentication() {
+    }
+
+    public UserAuthentication(UserAuthenticationPK userAuthenticationPK) {
+        this.userAuthenticationPK = userAuthenticationPK;
+    }
+
+    public UserAuthentication(int userId, int userAuthenticationTypeId) {
+        this.userAuthenticationPK = new UserAuthenticationPK(userId, userAuthenticationTypeId);
+    }
+
+    public UserAuthenticationPK getUserAuthenticationPK() {
+        return userAuthenticationPK;
+    }
+
+    public void setUserAuthenticationPK(UserAuthenticationPK userAuthenticationPK) {
+        this.userAuthenticationPK = userAuthenticationPK;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public VipsLogicUser getVipsLogicUser() {
+        return vipsLogicUser;
+    }
+
+    public void setVipsLogicUser(VipsLogicUser vipsLogicUser) {
+        this.vipsLogicUser = vipsLogicUser;
+    }
+
+    public UserAuthenticationType getUserAuthenticationType() {
+        return userAuthenticationType;
+    }
+
+    public void setUserAuthenticationType(UserAuthenticationType userAuthenticationType) {
+        this.userAuthenticationType = userAuthenticationType;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (userAuthenticationPK != null ? userAuthenticationPK.hashCode() : 0);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof UserAuthentication)) {
+            return false;
+        }
+        UserAuthentication other = (UserAuthentication) object;
+        if ((this.userAuthenticationPK == null && other.userAuthenticationPK != null) || (this.userAuthenticationPK != null && !this.userAuthenticationPK.equals(other.userAuthenticationPK))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "no.bioforsk.vips.logic.entity.UserAuthentication[ userAuthenticationPK=" + userAuthenticationPK + " ]";
+    }
+
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/UserVipslogicRolePK.java b/src/main/java/no/bioforsk/vips/logic/entity/UserAuthenticationPK.java
similarity index 52%
rename from src/main/java/no/bioforsk/vips/logic/entity/UserVipslogicRolePK.java
rename to src/main/java/no/bioforsk/vips/logic/entity/UserAuthenticationPK.java
index 1a506a30253a2d3361465cc9bef00fcc79d29cc9..4b7575066e45f03a5000cf246f75f88344a12322 100644
--- a/src/main/java/no/bioforsk/vips/logic/entity/UserVipslogicRolePK.java
+++ b/src/main/java/no/bioforsk/vips/logic/entity/UserAuthenticationPK.java
@@ -1,5 +1,6 @@
 /*
- * To change this template, choose Tools | Templates
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
  * and open the template in the editor.
  */
 
@@ -16,30 +17,22 @@ import javax.validation.constraints.NotNull;
  * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
  */
 @Embeddable
-public class UserVipslogicRolePK implements Serializable {
-    @Basic(optional = false)
-    @NotNull
-    @Column(name = "vipslogic_role_id")
-    private int vipslogicRoleId;
+public class UserAuthenticationPK implements Serializable {
     @Basic(optional = false)
     @NotNull
     @Column(name = "user_id")
     private int userId;
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "user_authentication_type_id")
+    private int userAuthenticationTypeId;
 
-    public UserVipslogicRolePK() {
+    public UserAuthenticationPK() {
     }
 
-    public UserVipslogicRolePK(int vipslogicRoleId, int userId) {
-        this.vipslogicRoleId = vipslogicRoleId;
+    public UserAuthenticationPK(int userId, int userAuthenticationTypeId) {
         this.userId = userId;
-    }
-
-    public int getVipslogicRoleId() {
-        return vipslogicRoleId;
-    }
-
-    public void setVipslogicRoleId(int vipslogicRoleId) {
-        this.vipslogicRoleId = vipslogicRoleId;
+        this.userAuthenticationTypeId = userAuthenticationTypeId;
     }
 
     public int getUserId() {
@@ -50,25 +43,33 @@ public class UserVipslogicRolePK implements Serializable {
         this.userId = userId;
     }
 
+    public int getUserAuthenticationTypeId() {
+        return userAuthenticationTypeId;
+    }
+
+    public void setUserAuthenticationTypeId(int userAuthenticationTypeId) {
+        this.userAuthenticationTypeId = userAuthenticationTypeId;
+    }
+
     @Override
     public int hashCode() {
         int hash = 0;
-        hash += (int) vipslogicRoleId;
         hash += (int) userId;
+        hash += (int) userAuthenticationTypeId;
         return hash;
     }
 
     @Override
     public boolean equals(Object object) {
         // TODO: Warning - this method won't work in the case the id fields are not set
-        if (!(object instanceof UserVipslogicRolePK)) {
+        if (!(object instanceof UserAuthenticationPK)) {
             return false;
         }
-        UserVipslogicRolePK other = (UserVipslogicRolePK) object;
-        if (this.vipslogicRoleId != other.vipslogicRoleId) {
+        UserAuthenticationPK other = (UserAuthenticationPK) object;
+        if (this.userId != other.userId) {
             return false;
         }
-        if (this.userId != other.userId) {
+        if (this.userAuthenticationTypeId != other.userAuthenticationTypeId) {
             return false;
         }
         return true;
@@ -76,7 +77,7 @@ public class UserVipslogicRolePK implements Serializable {
 
     @Override
     public String toString() {
-        return "no.bioforsk.vips.logic.entity.UserVipslogicRolePK[ vipslogicRoleId=" + vipslogicRoleId + ", userId=" + userId + " ]";
+        return "no.bioforsk.vips.logic.entity.UserAuthenticationPK[ userId=" + userId + ", userAuthenticationTypeId=" + userAuthenticationTypeId + " ]";
     }
 
 }
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/UserAuthenticationType.java b/src/main/java/no/bioforsk/vips/logic/entity/UserAuthenticationType.java
new file mode 100644
index 0000000000000000000000000000000000000000..15fd784e8ef3ea455d590dd01d2b8948d5d53c94
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/entity/UserAuthenticationType.java
@@ -0,0 +1,120 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package no.bioforsk.vips.logic.entity;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+/**
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Entity
+@Table(name = "user_authentication_type")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserAuthenticationType.findAll", query = "SELECT u FROM UserAuthenticationType u"),
+    @NamedQuery(name = "UserAuthenticationType.findByUserAuthenticationTypeId", query = "SELECT u FROM UserAuthenticationType u WHERE u.userAuthenticationTypeId = :userAuthenticationTypeId"),
+    @NamedQuery(name = "UserAuthenticationType.findByName", query = "SELECT u FROM UserAuthenticationType u WHERE u.name = :name"),
+    @NamedQuery(name = "UserAuthenticationType.findByDescription", query = "SELECT u FROM UserAuthenticationType u WHERE u.description = :description")})
+public class UserAuthenticationType implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @Id
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "user_authentication_type_id")
+    private Integer userAuthenticationTypeId;
+    @Size(max = 63)
+    @Column(name = "name")
+    private String name;
+    @Size(max = 1023)
+    @Column(name = "description")
+    private String description;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "userAuthenticationType")
+    private Set<UserAuthentication> userAuthenticationSet;
+
+    public UserAuthenticationType() {
+    }
+
+    public UserAuthenticationType(Integer userAuthenticationTypeId) {
+        this.userAuthenticationTypeId = userAuthenticationTypeId;
+    }
+
+    public Integer getUserAuthenticationTypeId() {
+        return userAuthenticationTypeId;
+    }
+
+    public void setUserAuthenticationTypeId(Integer userAuthenticationTypeId) {
+        this.userAuthenticationTypeId = userAuthenticationTypeId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @XmlTransient
+    @JsonIgnore
+    public Set<UserAuthentication> getUserAuthenticationSet() {
+        return userAuthenticationSet;
+    }
+
+    public void setUserAuthenticationSet(Set<UserAuthentication> userAuthenticationSet) {
+        this.userAuthenticationSet = userAuthenticationSet;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (userAuthenticationTypeId != null ? userAuthenticationTypeId.hashCode() : 0);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof UserAuthenticationType)) {
+            return false;
+        }
+        UserAuthenticationType other = (UserAuthenticationType) object;
+        if ((this.userAuthenticationTypeId == null && other.userAuthenticationTypeId != null) || (this.userAuthenticationTypeId != null && !this.userAuthenticationTypeId.equals(other.userAuthenticationTypeId))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "no.bioforsk.vips.logic.entity.UserAuthenticationType[ userAuthenticationTypeId=" + userAuthenticationTypeId + " ]";
+    }
+
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/UserStatus.java b/src/main/java/no/bioforsk/vips/logic/entity/UserStatus.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ec9c8b95750df54a1b1a328bb45339c697be6ce
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/entity/UserStatus.java
@@ -0,0 +1,103 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+
+package no.bioforsk.vips.logic.entity;
+
+import java.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Entity
+@Table(name = "user_status")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "UserStatus.findAll", query = "SELECT u FROM UserStatus u"),
+    @NamedQuery(name = "UserStatus.findByUserStatusId", query = "SELECT u FROM UserStatus u WHERE u.userStatusId = :userStatusId"),
+    @NamedQuery(name = "UserStatus.findByName", query = "SELECT u FROM UserStatus u WHERE u.name = :name"),
+    @NamedQuery(name = "UserStatus.findByDescription", query = "SELECT u FROM UserStatus u WHERE u.description = :description")})
+public class UserStatus implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @Id
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "user_status_id")
+    private Integer userStatusId;
+    @Size(max = 63)
+    @Column(name = "name")
+    private String name;
+    @Size(max = 1023)
+    @Column(name = "description")
+    private String description;
+
+    public UserStatus() {
+    }
+
+    public UserStatus(Integer userStatusId) {
+        this.userStatusId = userStatusId;
+    }
+
+    public Integer getUserStatusId() {
+        return userStatusId;
+    }
+
+    public void setUserStatusId(Integer userStatusId) {
+        this.userStatusId = userStatusId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (userStatusId != null ? userStatusId.hashCode() : 0);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof UserStatus)) {
+            return false;
+        }
+        UserStatus other = (UserStatus) object;
+        if ((this.userStatusId == null && other.userStatusId != null) || (this.userStatusId != null && !this.userStatusId.equals(other.userStatusId))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "no.bioforsk.vips.logic.entity.UserStatus[ userStatusId=" + userStatusId + " ]";
+    }
+
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/UserVipslogicRole.java b/src/main/java/no/bioforsk/vips/logic/entity/UserVipslogicRole.java
deleted file mode 100644
index 7e2001b70ae6b3bc40a2b7efadf8122508252acc..0000000000000000000000000000000000000000
--- a/src/main/java/no/bioforsk/vips/logic/entity/UserVipslogicRole.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package no.bioforsk.vips.logic.entity;
-
-import java.io.Serializable;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.Table;
-import javax.xml.bind.annotation.XmlRootElement;
-
-/**
- * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
- * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
- */
-@Entity
-@Table(name = "user_vipslogic_role")
-@XmlRootElement
-@NamedQueries({
-    @NamedQuery(name = "UserVipslogicRole.findAll", query = "SELECT u FROM UserVipslogicRole u"),
-    @NamedQuery(name = "UserVipslogicRole.findByVipslogicRoleId", query = "SELECT u FROM UserVipslogicRole u WHERE u.userVipslogicRolePK.vipslogicRoleId = :vipslogicRoleId"),
-    @NamedQuery(name = "UserVipslogicRole.findByUserId", query = "SELECT u FROM UserVipslogicRole u WHERE u.userVipslogicRolePK.userId = :userId")})
-public class UserVipslogicRole implements Serializable {
-    private static final long serialVersionUID = 1L;
-    @EmbeddedId
-    protected UserVipslogicRolePK userVipslogicRolePK;
-    @JoinColumn(name = "vipslogic_role_id", referencedColumnName = "vipslogic_role_id", insertable = false, updatable = false)
-    @ManyToOne(optional = false)
-    private VipslogicRole vipslogicRole;
-
-    public UserVipslogicRole() {
-    }
-
-    public UserVipslogicRole(UserVipslogicRolePK userVipslogicRolePK) {
-        this.userVipslogicRolePK = userVipslogicRolePK;
-    }
-
-    public UserVipslogicRole(int vipslogicRoleId, int userId) {
-        this.userVipslogicRolePK = new UserVipslogicRolePK(vipslogicRoleId, userId);
-    }
-
-    public UserVipslogicRolePK getUserVipslogicRolePK() {
-        return userVipslogicRolePK;
-    }
-
-    public void setUserVipslogicRolePK(UserVipslogicRolePK userVipslogicRolePK) {
-        this.userVipslogicRolePK = userVipslogicRolePK;
-    }
-
-    public VipslogicRole getVipslogicRole() {
-        return vipslogicRole;
-    }
-
-    public void setVipslogicRole(VipslogicRole vipslogicRole) {
-        this.vipslogicRole = vipslogicRole;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 0;
-        hash += (userVipslogicRolePK != null ? userVipslogicRolePK.hashCode() : 0);
-        return hash;
-    }
-
-    @Override
-    public boolean equals(Object object) {
-        // TODO: Warning - this method won't work in the case the id fields are not set
-        if (!(object instanceof UserVipslogicRole)) {
-            return false;
-        }
-        UserVipslogicRole other = (UserVipslogicRole) object;
-        if ((this.userVipslogicRolePK == null && other.userVipslogicRolePK != null) || (this.userVipslogicRolePK != null && !this.userVipslogicRolePK.equals(other.userVipslogicRolePK))) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "no.bioforsk.vips.logic.entity.UserVipslogicRole[ userVipslogicRolePK=" + userVipslogicRolePK + " ]";
-    }
-
-}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/VipsLogicRole.java b/src/main/java/no/bioforsk/vips/logic/entity/VipsLogicRole.java
new file mode 100644
index 0000000000000000000000000000000000000000..37dfaf354cb4fe86fb16f7cd5370889e731fa710
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/entity/VipsLogicRole.java
@@ -0,0 +1,105 @@
+package no.bioforsk.vips.logic.entity;
+
+import java.io.Serializable;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.Table;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Entity
+@Table(name = "vips_logic_role")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "VipsLogicRole.findAll", query = "SELECT v FROM VipsLogicRole v"),
+    @NamedQuery(name = "VipsLogicRole.findByVipsLogicRoleId", query = "SELECT v FROM VipsLogicRole v WHERE v.vipsLogicRoleId = :vipsLogicRoleId"),
+    @NamedQuery(name = "VipsLogicRole.findByDefaultTitle", query = "SELECT v FROM VipsLogicRole v WHERE v.defaultTitle = :defaultTitle"),
+    @NamedQuery(name = "VipsLogicRole.findByDefaultDescription", query = "SELECT v FROM VipsLogicRole v WHERE v.defaultDescription = :defaultDescription")})
+public class VipsLogicRole implements Serializable {
+    
+    /** Static definitions */
+    public static Integer VIPS_LOGIC_ROLE_SUPERUSER = 1;
+    public static Integer VIPS_LOGIC_ROLE_ORGNANIZATION_ADMINISTRATOR = 2;
+
+    private static final long serialVersionUID = 1L;
+    @Id
+    @Basic(optional = false)
+    @NotNull
+    @Column(name = "vips_logic_role_id")
+    private Integer vipsLogicRoleId;
+    @Size(max = 255)
+    @Column(name = "default_title")
+    private String defaultTitle;
+    @Size(max = 2147483647)
+    @Column(name = "default_description")
+    private String defaultDescription;
+   
+
+    public VipsLogicRole() {
+    }
+
+    public VipsLogicRole(Integer vipsLogicRoleId) {
+        this.vipsLogicRoleId = vipsLogicRoleId;
+    }
+
+    public Integer getVipsLogicRoleId() {
+        return vipsLogicRoleId;
+    }
+
+    public void setVipsLogicRoleId(Integer vipsLogicRoleId) {
+        this.vipsLogicRoleId = vipsLogicRoleId;
+    }
+
+    public String getDefaultTitle() {
+        return defaultTitle;
+    }
+
+    public void setDefaultTitle(String defaultTitle) {
+        this.defaultTitle = defaultTitle;
+    }
+
+    public String getDefaultDescription() {
+        return defaultDescription;
+    }
+
+    public void setDefaultDescription(String defaultDescription) {
+        this.defaultDescription = defaultDescription;
+    }
+
+    
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (vipsLogicRoleId != null ? vipsLogicRoleId.hashCode() : 0);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof VipsLogicRole)) {
+            return false;
+        }
+        VipsLogicRole other = (VipsLogicRole) object;
+        if ((this.vipsLogicRoleId == null && other.vipsLogicRoleId != null) || (this.vipsLogicRoleId != null && !this.vipsLogicRoleId.equals(other.vipsLogicRoleId))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "no.bioforsk.vips.logic.entity.VipslogicRole[ vipslogicRoleId=" + vipsLogicRoleId + " ]";
+    }
+
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/VipsLogicUser.java b/src/main/java/no/bioforsk/vips/logic/entity/VipsLogicUser.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6a1a89c93dd5c86907a661998945d2f30c8cd7c
--- /dev/null
+++ b/src/main/java/no/bioforsk/vips/logic/entity/VipsLogicUser.java
@@ -0,0 +1,228 @@
+package no.bioforsk.vips.logic.entity;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlTransient;
+import org.codehaus.jackson.annotate.JsonIgnore;
+
+/**
+ * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
+ * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
+ */
+@Entity
+@Table(name = "vips_logic_user")
+@XmlRootElement
+@NamedQueries({
+    @NamedQuery(name = "VipsLogicUser.findAll", query = "SELECT v FROM VipsLogicUser v"),
+    @NamedQuery(name = "VipsLogicUser.findByUserId", query = "SELECT v FROM VipsLogicUser v WHERE v.userId = :userId"),
+    @NamedQuery(name = "VipsLogicUser.findByOrganizationId", query = "SELECT v FROM VipsLogicUser v WHERE v.organizationId = :organizationId"),
+    @NamedQuery(name = "VipsLogicUser.findByEmail", query = "SELECT v FROM VipsLogicUser v WHERE v.email = :email"),
+    @NamedQuery(name = "VipsLogicUser.findByFirstName", query = "SELECT v FROM VipsLogicUser v WHERE v.firstName = :firstName"),
+    @NamedQuery(name = "VipsLogicUser.findByLastName", query = "SELECT v FROM VipsLogicUser v WHERE v.lastName = :lastName")})
+public class VipsLogicUser implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Basic(optional = false)
+    @Column(name = "user_id")
+    private Integer userId;
+    //if the field contains email address consider using this annotation to enforce field validation
+    @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", message="Invalid email")
+    @Size(max = 1023)
+    @Column(name = "email")
+    private String email;
+    @Size(max = 255)
+    @Column(name = "first_name")
+    private String firstName;
+    @Size(max = 255)
+    @Column(name = "last_name")
+    private String lastName;
+    @Size(max = 2047)
+    @Column(name = "approval_application")
+    private String approvalApplication;
+    @Size(max = 2147483647)
+    @Column(name = "remarks")
+    private String remarks;
+    @OneToMany(cascade = CascadeType.ALL, mappedBy = "vipsLogicUser")
+    private Set<UserAuthentication> userAuthenticationSet;
+    @JoinColumn(name = "organization_id", referencedColumnName = "organization_id")
+    @ManyToOne
+    private Organization organizationId;
+    @JoinColumn(name = "user_status_id", referencedColumnName = "user_status_id")
+    @ManyToOne
+    private UserStatus userStatusId;
+    @ManyToMany(fetch=FetchType.EAGER)
+    @JoinTable(
+            name = "user_vips_logic_role",
+            joinColumns = {@JoinColumn(name = "user_id")},
+            inverseJoinColumns = {@JoinColumn(name = "vips_logic_role_id")}
+    )
+    private Set<VipsLogicRole> vipsLogicRoles;
+    
+    public VipsLogicUser() {
+    }
+
+    public VipsLogicUser(Integer userId) {
+        this.userId = userId;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public String getEmail() {
+        return email;
+    }
+
+    public void setEmail(String email) {
+        this.email = email;
+    }
+
+    public String getFirstName() {
+        return firstName;
+    }
+
+    public void setFirstName(String firstName) {
+        this.firstName = firstName;
+    }
+
+    public String getLastName() {
+        return lastName;
+    }
+
+    public void setLastName(String lastName) {
+        this.lastName = lastName;
+    }
+
+    @XmlTransient
+    @JsonIgnore
+    public Set<UserAuthentication> getUserAuthenticationSet() {
+        return userAuthenticationSet;
+    }
+
+    public void setUserAuthenticationSet(Set<UserAuthentication> userAuthenticationSet) {
+        this.userAuthenticationSet = userAuthenticationSet;
+    }
+
+    public Organization getOrganizationId() {
+        return organizationId;
+    }
+
+    public void setOrganizationId(Organization organizationId) {
+        this.organizationId = organizationId;
+    }
+
+    @Override
+    public int hashCode() {
+        int hash = 0;
+        hash += (userId != null ? userId.hashCode() : 0);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        // TODO: Warning - this method won't work in the case the id fields are not set
+        if (!(object instanceof VipsLogicUser)) {
+            return false;
+        }
+        VipsLogicUser other = (VipsLogicUser) object;
+        if ((this.userId == null && other.userId != null) || (this.userId != null && !this.userId.equals(other.userId))) {
+            return false;
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return "no.bioforsk.vips.logic.entity.VipsLogicUser[ userId=" + userId + " ]";
+    }
+
+    /**
+     * @return the approvalApplication
+     */
+    public String getApprovalApplication() {
+        return approvalApplication;
+    }
+
+    /**
+     * @param approvalApplication the approvalApplication to set
+     */
+    public void setApprovalApplication(String approvalApplication) {
+        this.approvalApplication = approvalApplication;
+    }
+
+    /**
+     * @return the remarks
+     */
+    public String getRemarks() {
+        return remarks;
+    }
+
+    /**
+     * @param remarks the remarks to set
+     */
+    public void setRemarks(String remarks) {
+        this.remarks = remarks;
+    }
+
+    /**
+     * @return the userStatusId
+     */
+    public UserStatus getUserStatusId() {
+        return userStatusId;
+    }
+
+    /**
+     * @param userStatusId the userStatusId to set
+     */
+    public void setUserStatusId(UserStatus userStatusId) {
+        this.userStatusId = userStatusId;
+    }
+
+    /**
+     * @return the vipsLogicRoles
+     */
+    public Set<VipsLogicRole> getVipsLogicRoles() {
+        return vipsLogicRoles;
+    }
+
+    /**
+     * @param vipsLogicRoles the vipsLogicRoles to set
+     */
+    public void setVipsLogicRoles(Set<VipsLogicRole> vipsLogicRoles) {
+        this.vipsLogicRoles = vipsLogicRoles;
+    }
+    
+    @JsonIgnore
+    public boolean isSuperUser()
+    {
+        for(VipsLogicRole role:this.getVipsLogicRoles()){
+            if(role.getVipsLogicRoleId().equals(VipsLogicRole.VIPS_LOGIC_ROLE_SUPERUSER))
+                return true;
+        }
+        return false;
+    }
+}
diff --git a/src/main/java/no/bioforsk/vips/logic/entity/VipslogicRole.java b/src/main/java/no/bioforsk/vips/logic/entity/VipslogicRole.java
deleted file mode 100644
index 9a6dc420f6c68fd92d0a3feccc08197c70eae94f..0000000000000000000000000000000000000000
--- a/src/main/java/no/bioforsk/vips/logic/entity/VipslogicRole.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
-
-package no.bioforsk.vips.logic.entity;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
-import javax.xml.bind.annotation.XmlRootElement;
-import javax.xml.bind.annotation.XmlTransient;
-import org.codehaus.jackson.annotate.JsonIgnore;
-
-/**
- * @copyright 2013 <a href="http://www.bioforsk.no/">Bioforsk</a>
- * @author Tor-Einar Skog <tor-einar.skog@bioforsk.no>
- */
-@Entity
-@Table(name = "vipslogic_role")
-@XmlRootElement
-@NamedQueries({
-    @NamedQuery(name = "VipslogicRole.findAll", query = "SELECT v FROM VipslogicRole v"),
-    @NamedQuery(name = "VipslogicRole.findByVipslogicRoleId", query = "SELECT v FROM VipslogicRole v WHERE v.vipslogicRoleId = :vipslogicRoleId"),
-    @NamedQuery(name = "VipslogicRole.findByDefaultTitle", query = "SELECT v FROM VipslogicRole v WHERE v.defaultTitle = :defaultTitle"),
-    @NamedQuery(name = "VipslogicRole.findByDefaultDescription", query = "SELECT v FROM VipslogicRole v WHERE v.defaultDescription = :defaultDescription")})
-public class VipslogicRole implements Serializable {
-    private static final long serialVersionUID = 1L;
-    @Id
-    @Basic(optional = false)
-    @NotNull
-    @Column(name = "vipslogic_role_id")
-    private Integer vipslogicRoleId;
-    @Size(max = 255)
-    @Column(name = "default_title")
-    private String defaultTitle;
-    @Size(max = 2147483647)
-    @Column(name = "default_description")
-    private String defaultDescription;
-    @OneToMany(cascade = CascadeType.ALL, mappedBy = "vipslogicRole")
-    private Set<UserVipslogicRole> userVipslogicRoleSet;
-
-    public VipslogicRole() {
-    }
-
-    public VipslogicRole(Integer vipslogicRoleId) {
-        this.vipslogicRoleId = vipslogicRoleId;
-    }
-
-    public Integer getVipslogicRoleId() {
-        return vipslogicRoleId;
-    }
-
-    public void setVipslogicRoleId(Integer vipslogicRoleId) {
-        this.vipslogicRoleId = vipslogicRoleId;
-    }
-
-    public String getDefaultTitle() {
-        return defaultTitle;
-    }
-
-    public void setDefaultTitle(String defaultTitle) {
-        this.defaultTitle = defaultTitle;
-    }
-
-    public String getDefaultDescription() {
-        return defaultDescription;
-    }
-
-    public void setDefaultDescription(String defaultDescription) {
-        this.defaultDescription = defaultDescription;
-    }
-
-    @XmlTransient
-    @JsonIgnore
-    public Set<UserVipslogicRole> getUserVipslogicRoleSet() {
-        return userVipslogicRoleSet;
-    }
-
-    public void setUserVipslogicRoleSet(Set<UserVipslogicRole> userVipslogicRoleSet) {
-        this.userVipslogicRoleSet = userVipslogicRoleSet;
-    }
-
-    @Override
-    public int hashCode() {
-        int hash = 0;
-        hash += (vipslogicRoleId != null ? vipslogicRoleId.hashCode() : 0);
-        return hash;
-    }
-
-    @Override
-    public boolean equals(Object object) {
-        // TODO: Warning - this method won't work in the case the id fields are not set
-        if (!(object instanceof VipslogicRole)) {
-            return false;
-        }
-        VipslogicRole other = (VipslogicRole) object;
-        if ((this.vipslogicRoleId == null && other.vipslogicRoleId != null) || (this.vipslogicRoleId != null && !this.vipslogicRoleId.equals(other.vipslogicRoleId))) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return "no.bioforsk.vips.logic.entity.VipslogicRole[ vipslogicRoleId=" + vipslogicRoleId + " ]";
-    }
-
-}
diff --git a/src/main/java/no/bioforsk/vips/logic/scheduling/model/AppleScabModelPreprocessor.java b/src/main/java/no/bioforsk/vips/logic/scheduling/model/AppleScabModelPreprocessor.java
index 9a9536fd56d11ca582017df3ac218259fb767a6c..a52e2af0effffdad1dd8c04c8fabbb4b9627cb2b 100644
--- a/src/main/java/no/bioforsk/vips/logic/scheduling/model/AppleScabModelPreprocessor.java
+++ b/src/main/java/no/bioforsk/vips/logic/scheduling/model/AppleScabModelPreprocessor.java
@@ -23,7 +23,7 @@ public class AppleScabModelPreprocessor extends ModelRunPreprocessor{
     @Override
     public ModelConfiguration getModelConfiguration(ForecastConfiguration configuration) {
         //configuration.getDateStart();
-        PointOfInterestWeatherStation weatherStation = (PointOfInterestWeatherStation) configuration.getPointOfInterestId();
+        PointOfInterestWeatherStation weatherStation = (PointOfInterestWeatherStation) configuration.getLocationPointOfInterestId();
         // What timezone is the calculation for
         TimeZone timeZone = TimeZone.getTimeZone(weatherStation.getTimeZone());
         System.out.println("timeZone ID in preprocessor=" + timeZone.getID());
diff --git a/src/main/java/no/bioforsk/vips/logic/scheduling/model/ForecastConfiguration.java b/src/main/java/no/bioforsk/vips/logic/scheduling/model/ForecastConfiguration.java
index 8d56546aba6c4e2388c1c6c2f4257eefcf4b5332..26e612e81d9f8b9776d6cbdd7ae39565b11f59ee 100644
--- a/src/main/java/no/bioforsk/vips/logic/scheduling/model/ForecastConfiguration.java
+++ b/src/main/java/no/bioforsk/vips/logic/scheduling/model/ForecastConfiguration.java
@@ -58,9 +58,12 @@ public class ForecastConfiguration implements Serializable {
     private Date dateEnd;
     @Column(name = "vips_core_user_id")
     private Integer vipsCoreUserId;
-    @JoinColumn(name = "point_of_interest_id", referencedColumnName = "point_of_interest_id")
+    @JoinColumn(name = "location_point_of_interest_id", referencedColumnName = "point_of_interest_id")
     @ManyToOne
-    private PointOfInterest pointOfInterestId;
+    private PointOfInterest locationPointOfInterestId;
+    @JoinColumn(name = "weather_station_point_of_interest_id", referencedColumnName = "point_of_interest_id")
+    @ManyToOne
+    private PointOfInterest weatherStationPointOfInterestId;
 
     public ForecastConfiguration() {
     }
@@ -109,12 +112,12 @@ public class ForecastConfiguration implements Serializable {
         this.vipsCoreUserId = vipsCoreUserId;
     }
 
-    public PointOfInterest getPointOfInterestId() {
-        return pointOfInterestId;
+    public PointOfInterest getLocationPointOfInterestId() {
+        return locationPointOfInterestId;
     }
 
-    public void setPointOfInterestId(PointOfInterest pointOfInterestId) {
-        this.pointOfInterestId = pointOfInterestId;
+    public void setLocationPointOfInterestId(PointOfInterest locationPointOfInterestId) {
+        this.locationPointOfInterestId = locationPointOfInterestId;
     }
 
     @Override
@@ -169,4 +172,18 @@ public class ForecastConfiguration implements Serializable {
         return null;
     }
 
+    /**
+     * @return the weatherStationPointOfInterestId
+     */
+    public PointOfInterest getWeatherStationPointOfInterestId() {
+        return weatherStationPointOfInterestId;
+    }
+
+    /**
+     * @param weatherStationPointOfInterestId the weatherStationPointOfInterestId to set
+     */
+    public void setWeatherStationPointOfInterestId(PointOfInterest weatherStationPointOfInterestId) {
+        this.weatherStationPointOfInterestId = weatherStationPointOfInterestId;
+    }
+
 }
diff --git a/src/main/java/no/bioforsk/vips/logic/session/UserBean.java b/src/main/java/no/bioforsk/vips/logic/session/UserBean.java
index 08b4321312396edb90b21a2c96abf9bb2f923467..cc98e84e629e3ff1e029add6ec29317fcd21eaff 100644
--- a/src/main/java/no/bioforsk/vips/logic/session/UserBean.java
+++ b/src/main/java/no/bioforsk/vips/logic/session/UserBean.java
@@ -1,14 +1,18 @@
 package no.bioforsk.vips.logic.session;
 
-import java.util.List;
+import java.io.IOException;
+import java.io.InputStream;
 import java.util.Map;
+import java.util.Properties;
 import javax.ejb.LocalBean;
 import javax.ejb.Stateless;
 import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
 import javax.persistence.PersistenceContext;
 import javax.persistence.Query;
-import no.bioforsk.vips.logic.entity.UserVipslogicRole;
-import no.bioforsk.vips.logic.util.Globals;
+import no.bioforsk.vips.logic.entity.UserAuthentication;
+import no.bioforsk.vips.logic.entity.VipsLogicUser;
+import no.bioforsk.vips.util.MD5Encrypter;
 
 /**
  * Handles user stuff, credentials
@@ -18,29 +22,49 @@ import no.bioforsk.vips.logic.util.Globals;
 @LocalBean
 @Stateless
 public class UserBean {
+    
+    
     @PersistenceContext(unitName="VIPSLogic-PU")
     EntityManager em;
     
-    /**
-     * 
-     * @param userId
-     * @return list of roles for this user
-     */
-    public List<UserVipslogicRole> getUserVipslogicRole(Integer userId)
+    private Properties serverProperties;
+    
+    public VipsLogicUser authenticateUser(Map loginInfo)
     {
-        Query q = em.createNamedQuery("UserVipslogicRole.findByUserId", UserVipslogicRole.class);
-        q.setParameter("userId", userId);
-        return q.getResultList();
+        
+        try
+        {
+            Query q = em.createNamedQuery("UserAuthentication.findByUsernameAndPassword", UserAuthentication.class);
+            q.setParameter("username", loginInfo.get("username"));
+            String salt = this.getVIPSLogicServerProperties().getProperty("MD5_SALT");
+            q.setParameter("password", MD5Encrypter.getMD5HexString((String)loginInfo.get("password"),salt));
+            UserAuthentication result = (UserAuthentication) q.getSingleResult();
+            return result.getVipsLogicUser();
+        }
+        catch(NoResultException | IOException ex)
+        {
+            if(ex instanceof IOException)
+            {
+                // TODO Throw an error instead
+                ex.printStackTrace();
+            }
+            // TODO sensible handling
+            return null;
+        }
     }
     
-    public boolean isSuperUser(Map userInfo)
+    /**
+     * @return Properties for this server
+     */
+    private Properties getVIPSLogicServerProperties() throws IOException
     {
-        List<UserVipslogicRole> roles = (List<UserVipslogicRole>) userInfo.get("roles");
-        for(UserVipslogicRole role : roles)
+        if(this.serverProperties == null)
         {
-            if(role.getVipslogicRole().getVipslogicRoleId().equals(Globals.ROLE_SUPERUSER))
-                return true;
+            this.serverProperties = new Properties();
+            try (InputStream in = this.getClass().getResourceAsStream("/server.properties")) {
+                this.serverProperties.load(in);
+            } 
         }
-        return false;
+        return this.serverProperties;
     }
 }
diff --git a/src/main/java/no/bioforsk/vips/logic/util/Globals.java b/src/main/java/no/bioforsk/vips/logic/util/Globals.java
index d259e3a8441d08563f8b8eaef3ca88f8b3fe1c90..1ff717a4f6b46acefc58300a9c0b4bde3e0df8cf 100644
--- a/src/main/java/no/bioforsk/vips/logic/util/Globals.java
+++ b/src/main/java/no/bioforsk/vips/logic/util/Globals.java
@@ -18,7 +18,9 @@ public class Globals {
         "/css",
         "/403",
         "/404",
-        "/rest"
+        "/rest",
+        "/test/testlogin.jsp",
+        "/test/testloginsuccess.jsp"
     };
     
     // Point of interest type IDs
diff --git a/src/main/resources/server.properties b/src/main/resources/server.properties
new file mode 100644
index 0000000000000000000000000000000000000000..1e79ab2e99c74ed1694d7f40b8fb6c2b3f24bb44
--- /dev/null
+++ b/src/main/resources/server.properties
@@ -0,0 +1,6 @@
+# To change this template, choose Tools | Templates
+# and open the template in the editor.
+
+
+# The salt for Md5 can of course NOT be part of the source! TODO Must be moved to the server's properties
+MD5_SALT=lfa98r32reoi30q8t3th34t9382ty932ty9hg98
diff --git a/src/main/webapp/test/testlogin.jsp b/src/main/webapp/test/testlogin.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..e36114a6033ae5256ff1640e1e498d02a09da577
--- /dev/null
+++ b/src/main/webapp/test/testlogin.jsp
@@ -0,0 +1,49 @@
+<%-- 
+    Document   : testlogin
+    Created on : Nov 25, 2013, 12:46:33 PM
+    Author     : treinar
+--%>
+<%@page import="no.bioforsk.vips.logic.authenticate.OpenIdRelyingParty"%>
+<%@page import="org.openid4java.message.AuthRequest"%>
+<%@page import="org.openid4java.discovery.Identifier"%>
+<%@page import="org.openid4java.discovery.DiscoveryInformation"%>
+<%@page import="java.util.List"%>
+<%@page import="org.openid4java.consumer.ConsumerManager"%>
+<%
+    String openIdStr = request.getParameter("openId");
+    String identifierName = "";
+    String loginType = request.getParameter("loginType");
+    if(loginType != null)
+    {
+        
+        OpenIdRelyingParty openId = new OpenIdRelyingParty();
+        if(loginType.equals("Google"))
+        {
+            openIdStr = "https://www.google.com/accounts/o8/id";
+        }
+        openId.authRequest(openIdStr, request, response);
+    }
+%>
+
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>Login test</title>
+    </head>
+    <body>
+        <h1>Login test</h1>
+        <form action="/test/testlogin.jsp" method="GET">
+            <input type="hidden" name="loginType" value="openId"/>
+            <label for="openId">My OpenId</label> <a href="" target="new">What is OpenId?</a>
+            <input type="text" name="openId"/>
+            <input type="submit" value="Log in with my OpenID"/>
+        </form>
+        <form action="/test/testlogin.jsp" method="GET">
+            <input type="hidden" name="loginType" value="Google"/>
+            <input type="submit" value="Log in with my Google Account"/>
+        </form>
+        <p><%=identifierName%></p>
+    </body>
+</html>
diff --git a/src/main/webapp/test/testloginsuccess.jsp b/src/main/webapp/test/testloginsuccess.jsp
new file mode 100644
index 0000000000000000000000000000000000000000..2e7c277c69a38a63fa087ec4576e51b77a93ecb1
--- /dev/null
+++ b/src/main/webapp/test/testloginsuccess.jsp
@@ -0,0 +1,37 @@
+<%-- 
+    Document   : testloginsuccess
+    Created on : Nov 25, 2013, 4:04:27 PM
+    Author     : treinar
+--%>
+<%@page import="no.bioforsk.vips.logic.authenticate.OpenIdAuthAttributes"%>
+<%@page import="no.bioforsk.vips.logic.authenticate.OpenIdRelyingParty"%>
+<%@page import="org.openid4java.discovery.Identifier"%>
+<%@page import="org.openid4java.consumer.ConsumerManager"%>
+<%@page import="org.openid4java.consumer.VerificationResult"%>
+<%@page import="org.openid4java.discovery.DiscoveryInformation"%>
+<%@page import="org.openid4java.message.ParameterList"%>
+<%
+    OpenIdRelyingParty relP = new OpenIdRelyingParty();
+    OpenIdAuthAttributes attributes = relP.verifyResponse(request);
+%>
+
+
+<%@page contentType="text/html" pageEncoding="UTF-8"%>
+<!DOCTYPE html>
+<html>
+    <head>
+        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+        <title>JSP Page</title>
+    </head>
+    <body>
+        <% if(attributes != null) { %>
+        <h1>Login success!</h1>
+        <ul>
+            <li><%= attributes.getOpenId()%></li>
+            <li><%= attributes.getEmail() %></li>
+        </ul>
+        <% } else { %>
+        <h1>Login failure</h1>
+        <% } %>
+    </body>
+</html>