diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
index 6fad12792a935bded0ad15b15bfc40d3a8cfe521..e4a007b82a11285c5c2e07f8a317b86c9b1718f0 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
@@ -1,5 +1,6 @@
 #Sat Jan 22 17:01:28 CET 2011
 actualPoints=Actual score
+attemptsleft=$org.olat.modules.iq\:attemptsleft
 assessment.comment.legend=Please use the following text box if you need to provide any additional information, comments or feedback during this test:
 assessment.item.status.review=Review
 assessment.item.status.notSeen=Not seen
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java
index 37446b11ac27f924aa314cd3f85b8ce1a5118be4..ee314a6339377a0642bc30c7b5162952ec6214cb 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponent.java
@@ -23,6 +23,7 @@ import org.olat.core.gui.UserRequest;
 
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest;
 import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest;
+import uk.ac.ed.ph.jqtiplus.running.ItemProcessingContext;
 import uk.ac.ed.ph.jqtiplus.running.TestSessionController;
 import uk.ac.ed.ph.jqtiplus.state.ItemSessionState;
 import uk.ac.ed.ph.jqtiplus.state.TestPlanNode;
@@ -92,6 +93,11 @@ public class AssessmentTreeComponent extends AssessmentObjectComponent {
 		TestSessionState sessionState = getTestSessionController().getTestSessionState();
 		return sessionState.getItemSessionStates().get(nodeKey);
 	}
+	
+	public ItemProcessingContext getItemSessionState(TestPlanNode itemRefNode) {
+		ItemProcessingContext itemProcessingContext = getTestSessionController().getItemProcessingContext(itemRefNode);
+		return itemProcessingContext;
+	}
 
 	@Override
 	protected void doDispatchRequest(UserRequest ureq) {
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java
index 38ae144236f7cd20adc4f9cd2ffecb7520770a94..3180808913c5f13718b53e4a2417222c16c27bd5 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentTreeComponentRenderer.java
@@ -28,6 +28,7 @@ import org.olat.core.gui.render.Renderer;
 import org.olat.core.gui.render.StringOutput;
 import org.olat.core.gui.render.URLBuilder;
 import org.olat.core.gui.translator.Translator;
+import org.olat.core.util.StringHelper;
 import org.olat.ims.qti21.AssessmentTestSession;
 import org.olat.ims.qti21.model.CandidateTestEventType;
 import org.olat.ims.qti21.model.jpa.CandidateEvent;
@@ -38,6 +39,8 @@ import uk.ac.ed.ph.jqtiplus.node.content.variable.PrintedVariable;
 import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
 import uk.ac.ed.ph.jqtiplus.node.test.NavigationMode;
 import uk.ac.ed.ph.jqtiplus.node.test.TestPart;
+import uk.ac.ed.ph.jqtiplus.running.ItemProcessingContext;
+import uk.ac.ed.ph.jqtiplus.running.ItemSessionController;
 import uk.ac.ed.ph.jqtiplus.running.TestSessionController;
 import uk.ac.ed.ph.jqtiplus.state.ItemSessionState;
 import uk.ac.ed.ph.jqtiplus.state.TestPlanNode;
@@ -157,16 +160,32 @@ public class AssessmentTreeComponentRenderer extends AssessmentObjectComponentRe
 		}
 		sb.append("<span class='questionTitle'>").append(itemNode.getSectionPartTitle()).append("</span>");
 
-		ItemSessionState itemSessionState = component.getItemSessionState(itemNode.getKey());
+
+		ItemProcessingContext itemProcessingContext = component.getItemSessionState(itemNode);
+		ItemSessionState itemSessionState = itemProcessingContext.getItemSessionState();;
 		if(enable) {
 			sb.append("</a>");
 		} else {
 			sb.append("</span>");
 		}
-		
+
 		//attempts
 		int numOfAttempts = itemSessionState.getNumAttempts();
-		sb.append("<span class='o_assessmentitem_attempts'>").append(numOfAttempts).append("</span>");
+		int maxAttempts = 0;
+		if(itemProcessingContext instanceof ItemSessionController) {
+			ItemSessionController itemSessionController = (ItemSessionController)itemProcessingContext;
+			maxAttempts = itemSessionController.getItemSessionControllerSettings().getMaxAttempts();
+		}
+		
+		sb.append("<span class='o_assessmentitem_attempts'");
+		if(maxAttempts > 0) {
+			String title = translator.translate("attemptsleft", new String[] { Integer.toString((maxAttempts - numOfAttempts)) });
+			sb.append(" title=\"").append(StringHelper.escapeHtml(title)).append("\">")
+			  .append("<i class='o_icon o_icon_attempt_limit'> </i> ");
+		} else {
+			sb.append(">");
+		}
+		sb.append(numOfAttempts).append("</span>");
 		//status
 		renderItemStatus(sb, itemSessionState, options, translator);