diff --git a/src/main/java/org/olat/core/gui/components/image/ImageComponent.java b/src/main/java/org/olat/core/gui/components/image/ImageComponent.java
index 40310a075f3d28dc037904c705fe85f30243cb7f..164664f098c96e7f819421e911eb8a833f54b1f7 100644
--- a/src/main/java/org/olat/core/gui/components/image/ImageComponent.java
+++ b/src/main/java/org/olat/core/gui/components/image/ImageComponent.java
@@ -29,9 +29,14 @@ package org.olat.core.gui.components.image;
 import java.awt.image.BufferedImage;
 import java.io.BufferedInputStream;
 import java.io.IOException;
+import java.util.Iterator;
 
 import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import javax.imageio.stream.MemoryCacheImageInputStream;
 
+import org.apache.commons.io.IOUtils;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.ComponentRenderer;
@@ -39,6 +44,8 @@ import org.olat.core.gui.media.MediaResource;
 import org.olat.core.logging.AssertException;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
+import org.olat.core.util.StringHelper;
+import org.olat.core.util.image.Size;
 
 /**
  * Description: <br>
@@ -137,17 +144,28 @@ public class ImageComponent extends Component {
 		if (mediaResource == null || mediaResource.getInputStream() == null) {
 			throw new AssertException("Set media resource to a valid value befor calling scaleToFit::" + mediaResource);
 		}
-		BufferedInputStream fileStrean = null;
-		BufferedImage imageSrc = null;
+
 		try {
-			fileStrean = new BufferedInputStream(mediaResource.getInputStream());
-			imageSrc = ImageIO.read(fileStrean);
-			if (imageSrc == null) {
-				// happens with faulty Java implementation, e.g. on MacOSX
+			String type = mediaResource.getContentType();
+			String suffix = getSuffix(type);
+
+			Size size = null;
+			if(StringHelper.containsNonWhitespace(suffix)) {
+				size = getImageSize(suffix);
+				if(size != null) {
+					System.out.println(size);
+				}
+			}
+			if(size == null) {
+				size = getImageSizeFallback();
+			}
+			if(size == null) {
 				return;
 			}
-			double realWidth = imageSrc.getWidth();
-			double realHeight = imageSrc.getHeight();
+
+			double realWidth = size.getWidth();
+			double realHeight = size.getHeight();
+			
 			// calculate scaling factor
 			double scalingFactor = 1;
 			if (realWidth > maxWidth) {
@@ -160,21 +178,70 @@ public class ImageComponent extends Component {
 			}
 			setHeight(new Long( Math.round(realHeight * scalingFactor)));
 			setWidth(new Long( Math.round(realWidth * scalingFactor)));
-		} catch (IOException e) {
+		} catch (Exception e) {
 			// log error, don't do anything else
 			log.error("Problem while setting image size to fit " + maxWidth + "x" + maxHeight + " for resource::" + mediaResource, e);
-		} finally {
-			// release all resources
-			if (fileStrean != null) {
-				try {
-					fileStrean.close();
-				} catch (IOException e) {
-					log.error("Problem while closing file stream for resource::" + mediaResource, e);
-				}
+		} 
+	}
+	
+	private String getSuffix(String contentType) {
+		contentType = contentType.toLowerCase();
+		if(contentType.indexOf("jpg") >= 0 || contentType.indexOf("jpeg") >= 0) {
+			return "jpg";
+		}
+		if(contentType.indexOf("gif") >= 0) {
+			return "gif";
+		}
+		if(contentType.indexOf("png") >= 0) {
+			return "png";
+		}
+		return null;
+	}
+	
+	private Size getImageSizeFallback() {
+		BufferedInputStream fileStrean = null;
+		BufferedImage imageSrc = null;
+		try {
+			fileStrean = new BufferedInputStream(mediaResource.getInputStream());
+			imageSrc = ImageIO.read(fileStrean);
+			if (imageSrc == null) {
+				// happens with faulty Java implementation, e.g. on MacOSX
+				return null;
 			}
+			double realWidth = imageSrc.getWidth();
+			double realHeight = imageSrc.getHeight();
+			return new Size((int)realWidth, (int)realHeight, false);
+		} catch (IOException e) {
+			// log error, don't do anything else
+			log.error("Problem while setting image size to fit for resource::" + mediaResource, e);
+			return null;
+		} finally {
+			IOUtils.closeQuietly(fileStrean);
 			if (imageSrc != null) {
 				imageSrc.flush();
 			}
 		}
 	}
+	
+	private Size getImageSize(String suffix) {
+		Size result = null;
+    Iterator<ImageReader> iter = ImageIO.getImageReadersBySuffix(suffix);
+    if (iter.hasNext()) {
+        ImageReader reader = iter.next();
+        try {
+            ImageInputStream stream = new MemoryCacheImageInputStream(mediaResource.getInputStream());
+            reader.setInput(stream);
+            int width = reader.getWidth(reader.getMinIndex());
+            int height = reader.getHeight(reader.getMinIndex());
+            result = new Size(width, height, false);
+        } catch (IOException e) {
+            log.error(e.getMessage());
+        } finally {
+            reader.dispose();
+        }
+    } else {
+        log.error("No reader found for given format: " + suffix);
+    }
+    return result;
+	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/core/util/image/Size.java b/src/main/java/org/olat/core/util/image/Size.java
index 475ff5bbe3d9996e0c3690c7e0be47a016e54355..16d254141aa94ff8f7705014e3a63895281c2826 100644
--- a/src/main/java/org/olat/core/util/image/Size.java
+++ b/src/main/java/org/olat/core/util/image/Size.java
@@ -19,6 +19,11 @@
  */
 package org.olat.core.util.image;
 
+/**
+ * 
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix
+ *
+ */
 public class Size {
 	private final int width;
 	private final int height;
@@ -47,4 +52,14 @@ public class Size {
 	public boolean isChanged() {
 		return changed;
 	}
+	
+	@Override
+	public String toString() {
+		StringBuilder sb = new StringBuilder();
+		sb.append("Size[width=").append(width)
+			.append(":height=").append(height)
+			.append(":changed=").append(changed)
+			.append("]").append(super.toString());
+		return sb.toString();
+	}
 }
diff --git a/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java b/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java
index 83d3d4d799a7d128ef79e026a37d8580e5730dd4..1a62b862826e1f71e8ab216cfc83b3bf089c50bb 100644
--- a/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java
+++ b/src/main/java/org/olat/course/condition/interpreter/IsCourseAdministratorFunction.java
@@ -26,6 +26,7 @@
 package org.olat.course.condition.interpreter;
 
 import org.olat.core.id.Identity;
+import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.groupsandrights.CourseGroupManager;
@@ -40,6 +41,7 @@ import org.olat.course.run.userview.UserCourseEnvironment;
  * @author gnaegi
  */
 public class IsCourseAdministratorFunction extends AbstractFunction {
+	private static final OLog log = Tracing.createLoggerFor(IsCourseAdministratorFunction.class);
 	public static final String name = "isCourseAdministrator";
 
 	/**
@@ -66,10 +68,9 @@ public class IsCourseAdministratorFunction extends AbstractFunction {
 		Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity();
 		CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager();
 		boolean isCourseAdmin = cgm.isIdentityCourseAdministrator(ident);
-		if (Tracing.isDebugEnabled(IsCourseAdministratorFunction.class)) {
-			Tracing.logDebug("identity "+ident.getName()+", courseadministrator:"+isCourseAdmin+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId(), IsCourseAdministratorFunction.class);
+		if(log.isDebug()) {
+			log.debug("identity "+ident.getName()+", courseadministrator:"+isCourseAdmin+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId());
 		}
-		
 		return isCourseAdmin ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE;
 	}
 
diff --git a/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java b/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java
index 833a91c7f624fe65ad01c68cc5e72ac0b7d023c3..25b1970c3f7f57f6af0e2a9bf36337191bcb2e4b 100644
--- a/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java
+++ b/src/main/java/org/olat/course/condition/interpreter/IsCourseCoachFunction.java
@@ -26,6 +26,7 @@
 package org.olat.course.condition.interpreter;
 
 import org.olat.core.id.Identity;
+import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.groupsandrights.CourseGroupManager;
@@ -37,6 +38,7 @@ import org.olat.course.run.userview.UserCourseEnvironment;
  * Description: A user is course coach if he/she is in at least one owner group of a learning group of the learning group context of the course
  */
 public class IsCourseCoachFunction extends AbstractFunction {
+	private static final OLog log = Tracing.createLoggerFor(IsCourseCoachFunction.class);
 	public static final String name = "isCourseCoach";
 	
 	/**
@@ -62,8 +64,8 @@ public class IsCourseCoachFunction extends AbstractFunction {
 		Identity ident = getUserCourseEnv().getIdentityEnvironment().getIdentity();
 		CourseGroupManager cgm = getUserCourseEnv().getCourseEnvironment().getCourseGroupManager();
 		boolean isCourseCoach = cgm.isIdentityCourseCoach(ident);
-		if (Tracing.isDebugEnabled(IsCourseCoachFunction.class)) {
-			Tracing.logDebug("identity "+ident.getName()+", coursecoach:"+isCourseCoach+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId(), IsCourseCoachFunction.class);
+		if (log.isDebug()) {
+			log.debug("identity "+ident.getName()+", coursecoach:"+isCourseCoach+", in course "+getUserCourseEnv().getCourseEnvironment().getCourseResourceableId());
 		}
 		
 		return isCourseCoach ? ConditionInterpreter.INT_TRUE: ConditionInterpreter.INT_FALSE;