diff --git a/solutions.digamma.damas.api/src/main/java/module-info.java b/solutions.digamma.damas.api/src/main/java/module-info.java
index a5992ae5..4264c110 100644
--- a/solutions.digamma.damas.api/src/main/java/module-info.java
+++ b/solutions.digamma.damas.api/src/main/java/module-info.java
@@ -10,6 +10,5 @@
exports solutions.digamma.damas.search;
exports solutions.digamma.damas.common;
exports solutions.digamma.damas.user;
- exports solutions.digamma.damas.login;
exports solutions.digamma.damas.session;
-}
\ No newline at end of file
+}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/login/LoginManager.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/login/LoginManager.java
deleted file mode 100644
index a9695346..00000000
--- a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/login/LoginManager.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package solutions.digamma.damas.login;
-
-import solutions.digamma.damas.common.WorkspaceException;
-
-/**
- * Username/password login manager.
- *
- * @author Ahmad Shahwan
- */
-public interface LoginManager {
-
- /**
- * Check user credentials and grant them a user session if credentials are
- * valid. If credential are not usable, throw exception.
- *
- * @param username
- * @param password
- * @return
- * @throws WorkspaceException
- */
- Token login(String username, String password)
- throws WorkspaceException;
-
- void logout(Token token) throws WorkspaceException;
-}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Connection.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Connection.java
new file mode 100644
index 00000000..2058f12c
--- /dev/null
+++ b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Connection.java
@@ -0,0 +1,49 @@
+package solutions.digamma.damas.session;
+
+import solutions.digamma.damas.common.WorkspaceException;
+
+/**
+ * A connection is a set of operations that are executed with the same user
+ * session. A part from login, a valid connection is required for all workspace
+ * operations.
+ *
+ * To create a connection, a valid used token is required, thus a valid login.
+ * An instance of this class can only be obtained by calling the method {@code
+ * connect} of a {@link ConnectionManager}.
+ *
+ * Once a connection is created, workspace methods called in the same thread
+ * are done in behalf of the user session that created the connection, until the
+ * connection is closed or another connection is created.
+ *
+ * Connections are closable. The user is encourage to close the connection as
+ * soon as possible to avoid security breaches. The best way to use connections
+ * is as a resource in a try-with-resource structure.
+ *
+ * A valid token (thus a valid user session) can be used to create as many
+ * connections as needed, as long as those connections are property closed.
+ *
+ * A connection can be committed or rolled back as many times as needed.
+ */
+public interface Connection extends AutoCloseable {
+
+ /**
+ * Commit connection, persisting all changed in the user session.
+ *
+ * @throws WorkspaceException when a workspace exception occurs
+ */
+ void commit() throws WorkspaceException;
+
+ /**
+ * Rollback connection, resetting session data to the persisted state.
+ *
+ * @throws WorkspaceException when a workspace exception occurs
+ */
+ void rollback() throws WorkspaceException;
+
+ /**
+ * Close connection.
+ *
+ * @throws WorkspaceException when a workspace exception occurs
+ */
+ void close() throws WorkspaceException;
+}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/ConnectionManager.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/ConnectionManager.java
new file mode 100644
index 00000000..76d88184
--- /dev/null
+++ b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/ConnectionManager.java
@@ -0,0 +1,24 @@
+package solutions.digamma.damas.session;
+
+import solutions.digamma.damas.common.WorkspaceException;
+
+/**
+ * Connection manager.
+ *
+ * A service class used to create a new connection.
+ */
+public interface ConnectionManager {
+
+ /**
+ * Initiate a new connection.
+ *
+ * This method is the only way to acquire a new valid workspace connection.
+ *
+ * To create a new connection a valid (authenticated) token is required.
+ *
+ * @param token authentication token
+ * @return workspace connection
+ * @throws WorkspaceException when a workspace exception occurs
+ */
+ Connection connect(Token token) throws WorkspaceException;
+}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/LoginManager.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/LoginManager.java
new file mode 100644
index 00000000..77fa6ade
--- /dev/null
+++ b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/LoginManager.java
@@ -0,0 +1,33 @@
+package solutions.digamma.damas.session;
+
+import solutions.digamma.damas.common.WorkspaceException;
+
+/**
+ * Username/password login manager.
+ *
+ * @author Ahmad Shahwan
+ */
+public interface LoginManager {
+
+ /**
+ * Check user credentials and grant them a user session if credentials are
+ * valid. If credential are not usable, throw exception.
+ *
+ * @param username username
+ * @param password password
+ * @return a token representing user session
+ * @throws WorkspaceException when credential are not valid, or another
+ * error occurres
+ */
+ UserToken login(String username, String password) throws WorkspaceException;
+
+ UserSession identify(Token token) throws WorkspaceException;
+
+ /**
+ * Log out previously logged user, using their token.
+ *
+ * @param token user token
+ * @throws WorkspaceException if an error occurres
+ */
+ void logout(Token token) throws WorkspaceException;
+}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/login/Token.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Token.java
similarity index 52%
rename from solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/login/Token.java
rename to solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Token.java
index c1a95be9..ca98e23b 100644
--- a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/login/Token.java
+++ b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Token.java
@@ -1,7 +1,7 @@
-package solutions.digamma.damas.login;
+package solutions.digamma.damas.session;
/**
- * User session token.
+ * User token holding session secret.
*
* @author Ahmad Shahwan
*/
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Transaction.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Transaction.java
deleted file mode 100644
index 4f607714..00000000
--- a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/Transaction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package solutions.digamma.damas.session;
-
-import solutions.digamma.damas.common.WorkspaceException;
-
-/**
- * A transaction is a set of operations that are executed with the same user
- * session. A part from login, a transaction is required for all workspace
- * operations.
- *
- * To begin a transaction, a valid used token is required, thus a valid login.
- * An instance of this class can only be obtained by calling the method
- * begin of a TransactionManager.
- *
- * Once a transaction has begun, workspace methods called in the current thread
- * are done in behalf of the user session that began the transaction, until the
- * transaction is closed or another transaction is begun.
- *
- * Transactions are closable. The user is encourage to close the transaction as
- * soon as possible to avoid security breaches. The best way to use transactions
- * is as a resource in a try-with-resource structure.
- *
- * A valid toke (thus a valid user session) can be used to begin as many
- * transactions as needed, as long as those transactions are property closed.
- *
- * A transaction can be committed or rolled back as many times as needed.
- */
-public interface Transaction extends AutoCloseable {
-
- /**
- * Commit transaction, persisting all changed in the user session.
- *
- * @throws WorkspaceException when a workspace exception occurs
- */
- void commit() throws WorkspaceException;
-
- /**
- * Rollback transaction, resetting session data to the persisted state.
- *
- * @throws WorkspaceException when a workspace exception occurs
- */
- void rollback() throws WorkspaceException;
-
- /**
- * Close transaction.
- *
- * @throws WorkspaceException when a workspace exception occurs
- */
- void close() throws WorkspaceException;
-}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/TransactionManager.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/TransactionManager.java
deleted file mode 100644
index 115fad36..00000000
--- a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/TransactionManager.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package solutions.digamma.damas.session;
-
-import solutions.digamma.damas.common.WorkspaceException;
-import solutions.digamma.damas.login.Token;
-
-/**
- * Transaction manager.
- *
- * A service class used to create and begin transactions.
- */
-public interface TransactionManager {
-
- /**
- * Instantiate and begin a transaction.
- *
- * This method is the only way to acquire a valid workspace transaction.
- *
- * To create a new transaction a valid (authenticated) token is required.
- *
- * @param token authentication token
- * @return workspace transaction
- * @throws WorkspaceException when a workspace exception occurs
- */
- Transaction begin(Token token) throws WorkspaceException;
-}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/UserSession.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/UserSession.java
new file mode 100644
index 00000000..00f3326f
--- /dev/null
+++ b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/UserSession.java
@@ -0,0 +1,17 @@
+package solutions.digamma.damas.session;
+
+import java.util.Date;
+
+/**
+ * Information about current used session.
+ *
+ * An object of this type is returned when the who-am-I API is queried.
+ */
+public interface UserSession {
+
+ String getUserLogin();
+
+ Date getCreationDate();
+
+ Date getExpirationDate();
+}
diff --git a/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/UserToken.java b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/UserToken.java
new file mode 100644
index 00000000..f3278de7
--- /dev/null
+++ b/solutions.digamma.damas.api/src/main/java/solutions/digamma/damas/session/UserToken.java
@@ -0,0 +1,11 @@
+package solutions.digamma.damas.session;
+
+/**
+ * A used session information along side a session token.
+ *
+ * An object of this type is returned upon successful authentication. Both
+ * session information and token are usually needed for actions following once
+ * user is logged in.
+ */
+public interface UserToken extends UserSession, Token {
+}
diff --git a/solutions.digamma.damas.commons/src/main/java/solutions/digamma/damas/auth/AbstractLoginModule.java b/solutions.digamma.damas.commons/src/main/java/solutions/digamma/damas/auth/AbstractLoginModule.java
index 91b10559..0e933077 100644
--- a/solutions.digamma.damas.commons/src/main/java/solutions/digamma/damas/auth/AbstractLoginModule.java
+++ b/solutions.digamma.damas.commons/src/main/java/solutions/digamma/damas/auth/AbstractLoginModule.java
@@ -1,5 +1,7 @@
package solutions.digamma.damas.auth;
+import java.util.HashSet;
+import java.util.Set;
import javax.security.auth.Subject;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.NameCallback;
@@ -24,6 +26,7 @@ public abstract class AbstractLoginModule implements LoginModule {
protected String login;
protected char[] password;
protected List roles;
+ protected Set