diff --git a/sessionmanagermdl/sessionmanager.go b/sessionmanagermdl/sessionmanager.go
index 771a3ddaed2244e3e572f1cd4d266c8b920e0253..bcde051d05354001266697e755abac7ca43940e7 100644
--- a/sessionmanagermdl/sessionmanager.go
+++ b/sessionmanagermdl/sessionmanager.go
@@ -122,6 +122,40 @@ func Retrieve(key string) (Entry, error) {
 	}
 }
 
+// RetrieveAndExtend returns the entry and extends the entry expiration by provided `SECONDS`, only if remaining time < extendBy.
+// If extendBy < 0, it is same as Retrieve function.
+func RetrieveAndExtend(key string, extendBy int64) (Entry, error) {
+	entry, err := Retrieve(key)
+	if err != nil {
+		return Entry{}, err
+	}
+
+	if extendBy > 0 {
+		timeRemaining := entry.ExpiredAT - time.Now().Unix()
+
+		if timeRemaining < extendBy {
+			// update with new expiratin
+			entry.ExpiredAT = time.Now().Add(time.Second * time.Duration(extendBy)).Unix()
+
+			Store(key, entry)
+		}
+	}
+
+	return entry, nil
+}
+
+// RetrieveAndDelete deletes the entry after first retrieval
+func RetrieveAndDelete(key string) (Entry, error) {
+	entry, err := Retrieve(key)
+	if err != nil {
+		return Entry{}, err
+	}
+
+	store.Delete(key)
+
+	return entry, nil
+}
+
 // Delete removes the entry from session manager. If the key is not present, error `ErrSessionNotFound` will be thrown. Caller can ignore error if this is acceptable.
 func Delete(key string) error {
 	_, ok := store.Get(key)