diff --git a/sqldev/pom.xml b/sqldev/pom.xml
index ac802062..1f603664 100644
--- a/sqldev/pom.xml
+++ b/sqldev/pom.xml
@@ -11,7 +11,7 @@
 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 		<jdk.version>1.8</jdk.version>
 		<jdk.version.test>1.8</jdk.version.test>
-		<xtend.version>2.15.0</xtend.version>
+		<xtend.version>2.18.0</xtend.version>
 		<!-- requires SQL Developer 4.1.0 or higher (first version based on JDK 1.8) -->
 		<sqldev.basedir>/Applications/SQLDeveloper19.1.0.app/Contents/Resources/sqldeveloper</sqldev.basedir>
 		<final.name>utplsql_for_SQLDev_${project.version}</final.name>
@@ -170,17 +170,17 @@
 		<dependency>
 			<groupId>org.springframework</groupId>
 			<artifactId>spring-jdbc</artifactId>
-			<version>5.1.0.RELEASE</version>
+			<version>5.1.8.RELEASE</version>
 		</dependency>
 		<dependency>
 			<groupId>org.springframework</groupId>
 			<artifactId>spring-web</artifactId>
-			<version>5.1.0.RELEASE</version>
+			<version>5.1.8.RELEASE</version>
 		</dependency>
 		<dependency>
 			<groupId>org.oddgen</groupId>
 			<artifactId>org.oddgen.sqldev</artifactId>
-			<version>0.3.0</version>
+			<version>0.3.1</version>
 			<scope>provided</scope>
 		</dependency>
 		<dependency>
@@ -264,7 +264,7 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-surefire-plugin</artifactId>
-				<version>2.22.0</version>
+				<version>2.22.2</version>
 				<configuration>
 					<!-- -noverify is required in some environments to avoid java.lang.VerifyError -->
 					<argLine>-noverify
@@ -296,7 +296,7 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-antrun-plugin</artifactId>
-				<version>1.8</version>
+				<version>1.8</version><!--$NO-MVN-MAN-VER$-->
 				<executions>
 					<execution>
 						<phase>prepare-package</phase>
@@ -400,7 +400,7 @@
 			<plugin>
 				<groupId>org.apache.felix</groupId>
 				<artifactId>maven-bundle-plugin</artifactId>
-				<version>4.0.0</version>
+				<version>4.2.0</version>
 				<extensions>true</extensions>
 				<configuration>
 					<finalName>${project.name}</finalName>
@@ -450,7 +450,7 @@
 			</plugin>
 			<plugin>
 				<artifactId>maven-assembly-plugin</artifactId>
-				<version>3.1.0</version>
+				<version>3.1.1</version><!--$NO-MVN-MAN-VER$-->
 				<configuration>
 					<finalName>${final.name}</finalName>
 					<appendAssemblyId>false</appendAssemblyId>
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend
index 524c8c4f..43b212d1 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/model/preference/PreferenceModel.xtend
@@ -39,6 +39,7 @@ class PreferenceModel extends HashStructureAdapter {
 	static final String KEY_CLEAR_SCREEN = "clearScreen"
 	static final String KEY_AUTO_EXECUTE = "autoExecute"
 	static final String KEY_CHECK_RUN_UTPLSQL_TEST = "checkRunUtplsqlTest"
+	static final String KEY_USE_SMART_TIMES = "useSmartTimes"
 	static final String KEY_NUMBER_OF_RUNS_IN_HISTORY = "numberOfRunsInHistory"
 	static final String KEY_SHOW_DISABLED_COUNTER = "showDisabledCounter"
 	static final String KEY_SHOW_WARNINGS_COUNTER = "showWarningsCounter"
@@ -110,6 +111,14 @@ class PreferenceModel extends HashStructureAdapter {
 		getHashStructure.putBoolean(PreferenceModel.KEY_CHECK_RUN_UTPLSQL_TEST, checkRunUtplsqlTest)
 	}
 
+	def isUseSmartTimes() {
+		return getHashStructure.getBoolean(PreferenceModel.KEY_USE_SMART_TIMES, false)
+	}
+
+	def setUseSmartTimes(boolean useSmartTimes) {
+		getHashStructure.putBoolean(PreferenceModel.KEY_USE_SMART_TIMES, useSmartTimes)
+	}
+
 	def getNumberOfRunsInHistory() {
 		return getHashStructure.getInt(PreferenceModel.KEY_NUMBER_OF_RUNS_IN_HISTORY, 10)
 	}
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend
index 8e7bf49a..2500e178 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/runner/UtplsqlRunner.xtend
@@ -255,7 +255,7 @@ class UtplsqlRunner implements RealtimeReporterEventConsumer {
 	
 	private def initGUI() {
 		var RunnerView dockable = null
-		if (runningInSqlDeveloper && (dockable = RunnerFactory.dockable as RunnerView) === null) {
+		if (runningInSqlDeveloper && (dockable = RunnerFactory.dockable) === null) {
 			logger.severe('''Error getting utPLSQL dockable. Cannot run utPLSQL test.''')
 			return false
 		} else {
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend
index 2f49a44e..56667ee4 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/preference/PreferencePanel.xtend
@@ -22,10 +22,12 @@ import javax.swing.JButton
 import javax.swing.JCheckBox
 import javax.swing.JOptionPane
 import javax.swing.JPanel
+import javax.swing.JSeparator
 import javax.swing.JSpinner
 import javax.swing.JTabbedPane
 import javax.swing.JTextField
 import javax.swing.SpinnerNumberModel
+import javax.swing.SwingConstants
 import javax.swing.table.DefaultTableModel
 import oracle.dbtools.raptor.templates.CodeTemplateUtil
 import oracle.ide.panels.DefaultTraversablePanel
@@ -45,6 +47,7 @@ class PreferencePanel extends DefaultTraversablePanel {
 	val JCheckBox clearScreenCheckBox = new JCheckBox
 	val JCheckBox autoExecuteCheckBox = new JCheckBox
 	val JCheckBox checkRunUtplsqlTestCheckBox = new JCheckBox
+	val JCheckBox useSmartTimesCheckBox = new JCheckBox
 	val JButton importSnippetsButton = new JButton(UtplsqlResources.getString("PREF_IMPORT_SNIPPETS_BUTTON_LABEL"))
 	val JPanel realtimeReporterPanel = new JPanel
 	val SpinnerNumberModel numberOfRunsInHistoryModel = new SpinnerNumberModel(1, 1, 100, 1);
@@ -104,6 +107,10 @@ class PreferencePanel extends DefaultTraversablePanel {
 		runTab.add(
 			runTab.field.label.withText(UtplsqlResources.getString("PREF_CHECK_RUN_UTPLSQL_TEST_LABEL")).component(
 				checkRunUtplsqlTestCheckBox))
+		runTab.add(
+			runTab.field.label.withText(UtplsqlResources.getString("PREF_USE_SMART_TIMES_LABEL")).component(
+				useSmartTimesCheckBox))
+		runTab.addRow(new JSeparator(SwingConstants.HORIZONTAL))
 		runTab.addRow(importSnippetsButton)
 		runTab.addVerticalSpring
 		
@@ -336,6 +343,7 @@ class PreferencePanel extends DefaultTraversablePanel {
 		clearScreenCheckBox.selected = info.clearScreen
 		autoExecuteCheckBox.selected = info.autoExecute
 		checkRunUtplsqlTestCheckBox.selected = info.checkRunUtplsqlTest
+		useSmartTimesCheckBox.selected = info.useSmartTimes
 		numberOfRunsInHistorySpinner.value = info.numberOfRunsInHistory
 		showDisabledCounterCheckBox.selected = info.showDisabledCounter
 		showWarningsCounterCheckBox.selected = info.showWarningsCounter
@@ -371,6 +379,7 @@ class PreferencePanel extends DefaultTraversablePanel {
 		info.autoExecute = autoExecuteCheckBox.selected
 		info.numberOfRunsInHistory = numberOfRunsInHistorySpinner.value as Integer
 		info.checkRunUtplsqlTest = checkRunUtplsqlTestCheckBox.selected
+		info.useSmartTimes = useSmartTimesCheckBox.selected
 		info.showDisabledCounter = showDisabledCounterCheckBox.selected
 		info.showWarningsCounter = showWarningsCounterCheckBox.selected
 		info.showInfoCounter = showInfoCounterCheckBox.selected
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend
index 1fb4adaf..8c04e7b5 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/GradientToolbar.xtend
@@ -58,7 +58,7 @@ class GradientToolbar extends JToolBar {
 			val g2d = g as Graphics2D
 			val w = width
 	        val h = height - 1
-	        val h2 = height / 2 as int
+	        val int h2 = height / 2
 	        val colorTop = new Color(237, 237, 237)
 	        val colorMiddle = new Color(244, 244, 244)
 	        val colorBottom = new Color(254, 254, 254)
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend
index 5eb4de0f..6fe5f80d 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/RunnerPanel.xtend
@@ -26,7 +26,6 @@ import java.awt.event.ActionEvent
 import java.awt.event.ActionListener
 import java.awt.event.MouseEvent
 import java.awt.event.MouseListener
-import java.text.DecimalFormat
 import java.util.ArrayList
 import java.util.regex.Pattern
 import javax.swing.BorderFactory
@@ -75,6 +74,7 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener {
 	static val INDICATOR_WIDTH = 20
 	static val OVERVIEW_TABLE_ROW_HEIGHT = 20
 	static val TEXTPANE_DIM = new Dimension(100, 100)
+	static var boolean useSmartTimes
 	LimitedLinkedHashMap<String, Run> runs = new LimitedLinkedHashMap<String, Run>(10)
 	Run currentRun
 	JPanel basePanel
@@ -338,6 +338,7 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener {
 		fixCheckBoxMenuItem(showInfoIndicatorCheckBoxMenuItem)
 		syncDetailTabCheckBoxMenuItem.selected = preferences.syncDetailTab
 		fixCheckBoxMenuItem(syncDetailTabCheckBoxMenuItem)
+		useSmartTimes = preferences.useSmartTimes
 	}
 		
 	def setModel(Run run) {
@@ -349,7 +350,13 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener {
 	private def setCurrentRun(Run run) {
 		if (run !== currentRun) {
 			currentRun = run
-			testOverviewTableModel.setModel(run.tests, showTestDescriptionCheckBoxMenuItem.selected)
+			testOverviewTableModel.setModel(run.tests, showTestDescriptionCheckBoxMenuItem.selected, useSmartTimes)
+			val header = testOverviewTableModel.timeColumnName
+			val timeColumn = testOverviewTable.columnModel.getColumn(4)
+			if (timeColumn.headerValue != header) {
+				timeColumn.headerValue = header
+				testOverviewTable.tableHeader.repaint
+			}
 			resetDerived
 			val item = new ComboBoxItem<String, String>(currentRun.reporterId, currentRun.name)
 			runComboBox.selectedItem = item
@@ -640,12 +647,10 @@ class RunnerPanel implements ActionListener, MouseListener, HyperlinkListener {
 	}
 
    static class TimeFormatRenderer extends DefaultTableCellRenderer {
-		static val DecimalFormat formatter = new DecimalFormat("#,##0.000")
-
 		override getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
 			int row, int col) {
-			val renderedValue = if (value === null) {null} else {formatter.format(value as Number)}
-			return super.getTableCellRendererComponent(table, renderedValue, isSelected, hasFocus, row, col)
+			val smartTime = new SmartTime(value as Double, useSmartTimes)				
+			return super.getTableCellRendererComponent(table, smartTime.toString, isSelected, hasFocus, row, col)
 		}
 	}
 	
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend
new file mode 100644
index 00000000..627b6369
--- /dev/null
+++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/SmartTime.xtend
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2019 Philipp Salvisberg <philipp.salvisberg@trivadis.com>
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.utplsql.sqldev.ui.runner
+
+import java.text.DecimalFormat
+
+class SmartTime {
+	var Double seconds
+	var boolean smart = false
+	
+	new() {
+		super()
+	}
+	
+	new(Double seconds, boolean smart) {
+		super()
+		this.seconds = seconds
+		this.smart = smart
+	}
+	
+	def setMillis(Double seconds) {
+		this.seconds = seconds
+	}
+	
+	def setSmart(boolean smart) {
+		this.smart = smart
+	}
+	
+	def getSeconds() {
+		return seconds
+	} 
+	
+	override toString() {
+		var String ret;
+		if (seconds === null) {
+			ret = null
+		} else if (smart) {
+			if (seconds >= 60*60) {
+				val DecimalFormat formatter = new DecimalFormat("#0.00")
+				ret = formatter.format(seconds / 60 / 60) + " h"
+			} else if (seconds >= 60) {
+				val DecimalFormat formatter = new DecimalFormat("#0.00")
+				ret = formatter.format(seconds / 60) + " min"
+			} else if (seconds >= 1) {
+				val DecimalFormat formatter = new DecimalFormat("#0.000")
+				ret = formatter.format(seconds) + " s"
+			} else {
+				val DecimalFormat formatter = new DecimalFormat("##0")
+				ret = formatter.format(seconds * 1000) + " ms"				
+			}
+			
+		} else {
+			val DecimalFormat formatter = new DecimalFormat("##,##0.000")
+			ret = formatter.format(seconds)
+		}
+		return ret
+	}
+
+}
\ No newline at end of file
diff --git a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend
index 55c42d8a..c0f021c2 100644
--- a/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend
+++ b/sqldev/src/main/java/org/utplsql/sqldev/ui/runner/TestOverviewTableModel.xtend
@@ -27,6 +27,7 @@ class TestOverviewTableModel extends DefaultTableModel {
 	String commonPrefix
 	boolean commonPrefixCalculated
 	boolean showDescription
+	boolean useSmartTimes
 	
 	new() {
 		super()
@@ -40,10 +41,11 @@ class TestOverviewTableModel extends DefaultTableModel {
 		}
 	}
 	
-	def setModel(LinkedHashMap<String, Test> tests, boolean showDescription) {
+	def setModel(LinkedHashMap<String, Test> tests, boolean showDescription, boolean useSmartTimes) {
 		commonPrefixCalculated = false
 		this.tests = tests
 		this.showDescription = showDescription
+		this.useSmartTimes = useSmartTimes
 		calcCommonPrefix
 		fireTableDataChanged()
 	}
@@ -70,6 +72,11 @@ class TestOverviewTableModel extends DefaultTableModel {
 		}
 	}
 	
+	def getTimeColumnName() {
+		val timeColumnName = '''«UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN")»«IF !useSmartTimes» [s]«ENDIF»'''
+		return timeColumnName		
+	}
+	
 	def getTest(int row) {
 		val entry = tests.entrySet.get(row)
 		val test = tests.get(entry.key)
@@ -120,7 +127,7 @@ class TestOverviewTableModel extends DefaultTableModel {
 
 	override getColumnName(int col) {
 		return #["", "", "", UtplsqlResources.getString(if (showDescription) {"RUNNER_DESCRIPTION_LABEL"} else {"RUNNER_TEST_ID_COLUMN"}),
-			UtplsqlResources.getString("RUNNER_TEST_EXECUTION_TIME_COLUMN")].get(col)
+			timeColumnName].get(col)
 	}
 
 	override isCellEditable(int row, int column) {
diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties
index a74fe55e..630bc2b3 100644
--- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties
+++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources.properties
@@ -32,6 +32,7 @@ PREF_RESET_PACKAGE_LABEL=Reset package before running utPLSQL?
 PREF_CLEAR_SCREEN_LABEL=Clear script output panel before running utPLSQL?
 PREF_AUTO_EXECUTE_LABEL=Execute unit test automatically?
 PREF_CHECK_RUN_UTPLSQL_TEST_LABEL=Check availability of menu option?
+PREF_USE_SMART_TIMES_LABEL=Use smart times?
 PREF_IMPORT_SNIPPETS_BUTTON_LABEL=Import Snippets
 MENU_REALTIME_REPORTER_LABEL=Realtime Reporter
 PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL=Number of runs in history
@@ -89,7 +90,7 @@ RUNNER_NO_TESTS_FOUND_TEXT=No tests found.
 RUNNER_RUN_MENUITEM=Run test
 RUNNER_RUN_WORKSHEET_MENUITEM=Run test in new worksheet
 RUNNER_TEST_ID_COLUMN=Suitepath
-RUNNER_TEST_EXECUTION_TIME_COLUMN=Time [s]
+RUNNER_TEST_EXECUTION_TIME_COLUMN=Time
 RUNNER_OWNER_LABEL=Owner
 RUNNER_PACKAGE_LABEL=Package
 RUNNER_PROCEDURE_LABEL=Procedure
diff --git a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties
index cd4e0c12..2a275906 100644
--- a/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties
+++ b/sqldev/src/main/resources/org/utplsql/sqldev/resources/UtplsqlResources_de.properties
@@ -9,6 +9,7 @@ PREF_RESET_PACKAGE_LABEL=Package vor der Ausf
 PREF_CLEAR_SCREEN_LABEL=Skriptausgabe-Fenster vor der Ausf�hrung von utPLSQL leeren?
 PREF_AUTO_EXECUTE_LABEL=Unit Test automatisch ausf�hren?
 PREF_CHECK_RUN_UTPLSQL_TEST_LABEL=Verf�gbarkeit der Men�option pr�fen?
+PREF_USE_SMART_TIMES_LABEL=Smarte Zeitangaben verwenden?
 PREF_IMPORT_SNIPPETS_BUTTON_LABEL=Code-Schnipsel importieren
 MENU_REALTIME_REPORTER_LABEL=Realtime Reporter
 PREF_NUMBER_OF_RUNS_IN_HISTORY_LABEL=Anzahl Ausf�hrungen in der Historie
@@ -66,7 +67,7 @@ RUNNER_NO_TESTS_FOUND_TEXT=Keine Tests gefunden.
 RUNNER_RUN_MENUITEM=Run testTest ausf�hren
 RUNNER_RUN_WORKSHEET_MENUITEM=Test in neuem Arbeitsblatt ausf�hruen
 RUNNER_TEST_ID_COLUMN_NAME=Suitepath
-RUNNER_TEST_EXECUTION_TIME_COLUMN_NAME=Zeit [s]
+RUNNER_TEST_EXECUTION_TIME_COLUMN_NAME=Zeit
 RUNNER_OWNER_LABEL=Besitzer
 RUNNER_PACKAGE_LABEL=Paket
 RUNNER_PROCEDURE_LABEL=Prozedur
diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend
index a11c6b20..ffd3e963 100644
--- a/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend
+++ b/sqldev/src/test/java/org/utplsql/sqldev/test/coverage/CodeCoverageReporterDialogTest.xtend
@@ -26,7 +26,7 @@ class CodeCoverageReporterDialogTest extends AbstractJdbcTest{
 		val reporter = new CodeCoverageReporter(#["SCOTT"], #['a', 'b', 'c'], dataSource.connection)
 		reporter.showParameterWindow
 		Thread.sleep(4 * 1000)
-		reporter.frame.exit
+		reporter.frame?.exit
 	}
 	
 }
\ No newline at end of file
diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend
index b713cbc2..0bf3f7d9 100644
--- a/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend
+++ b/sqldev/src/test/java/org/utplsql/sqldev/test/dal/RealtimeReporterFetchSizeTest.xtend
@@ -104,7 +104,7 @@ class RealtimeReporterFetchSizeTest extends AbstractJdbcTest {
 
 	@Test 
 	def void delayFreeStreamingConsumtion() {
-		val long TOLERANCE_MS = 400
+		val long TOLERANCE_MS = 600
 		var ds = new SingleConnectionDataSource()
 		ds.driverClassName = "oracle.jdbc.OracleDriver"
 		ds.url = dataSource.url
diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend
index 4b575fca..32e9c1f7 100644
--- a/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend
+++ b/sqldev/src/test/java/org/utplsql/sqldev/test/preference/PreferenceModelTest.xtend
@@ -30,6 +30,7 @@ class PreferenceModelTest {
 		Assert.assertFalse(model.clearScreen)
 		Assert.assertTrue(model.autoExecute)
 		Assert.assertFalse(model.checkRunUtplsqlTest)
+		Assert.assertFalse(model.useSmartTimes)
 		Assert.assertEquals(model.numberOfRunsInHistory, 10)
 		Assert.assertFalse(model.showDisabledCounter)
 		Assert.assertFalse(model.showWarningsCounter)
diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend
index 7aca6152..7c4cff39 100644
--- a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend
+++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/ExpectationTest.xtend
@@ -1,3 +1,18 @@
+/*
+ * Copyright 2019 Philipp Salvisberg <philipp.salvisberg@trivadis.com>
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package org.utplsql.sqldev.test.runner
 
 import org.junit.Assert
diff --git a/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend
new file mode 100644
index 00000000..8b104e27
--- /dev/null
+++ b/sqldev/src/test/java/org/utplsql/sqldev/test/runner/SmartTimeTest.xtend
@@ -0,0 +1,147 @@
+/*
+ * Copyright 2019 Philipp Salvisberg <philipp.salvisberg@trivadis.com>
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.utplsql.sqldev.test.runner
+
+import org.junit.Assert
+import org.junit.Test
+import org.utplsql.sqldev.ui.runner.SmartTime
+
+class SmartTimeTest {
+
+	@Test
+	def null_default() {
+		val effective = (new SmartTime(null, false)).toString
+		Assert.assertEquals(null, effective);
+	}
+
+	@Test
+	def null_smart() {
+		val effective = (new SmartTime(null, true)).toString
+		Assert.assertEquals(null, effective);
+	}
+
+	@Test
+	def ms_0_default() {
+		val effective = (new SmartTime(0.0, false)).toString
+		Assert.assertEquals("0.000", effective);
+	}
+
+	@Test
+	def ms_0_smart() {
+		val effective = (new SmartTime(0.0, true)).toString
+		Assert.assertEquals("0 ms", effective);
+	}
+
+	@Test
+	def ms_999_default() {
+		val effective = (new SmartTime(0.999, false)).toString
+		Assert.assertEquals("0.999", effective);
+	}
+
+	@Test
+	def ms_999_smart() {
+		val effective = (new SmartTime(0.999, true)).toString
+		Assert.assertEquals("999 ms", effective);
+	}
+
+	@Test
+	def s_1_default() {
+		val effective = (new SmartTime(1.0, false)).toString
+		Assert.assertEquals("1.000", effective);
+	}
+
+	@Test
+	def s_1_smart() {
+		val effective = (new SmartTime(1.0, true)).toString
+		Assert.assertEquals("1.000 s", effective);
+	}
+
+	@Test
+	def s_59_default() {
+		val effective = (new SmartTime(59.999, false)).toString
+		Assert.assertEquals("59.999", effective);
+	}
+
+	@Test
+	def s_59_smart() {
+		val effective = (new SmartTime(59.999, true)).toString
+		Assert.assertEquals("59.999 s", effective);
+	}
+
+	@Test
+	def min_1_default() {
+		val effective = (new SmartTime(60.0, false)).toString
+		Assert.assertEquals("60.000", effective);
+	}
+
+	@Test
+	def min_1_smart() {
+		val effective = (new SmartTime(60.0, true)).toString
+		Assert.assertEquals("1.00 min", effective);
+	}
+
+	@Test
+	def min_59_default() {
+		val effective = (new SmartTime(3599.999, false)).toString
+		Assert.assertEquals("3,599.999", effective);
+	}
+
+	@Test
+	def min_59_smart_and_rounded() {
+		val effective = (new SmartTime(3599.999, true)).toString
+		Assert.assertEquals("60.00 min", effective);
+	}
+
+	@Test
+	def h_1_default() {
+		val effective = (new SmartTime(3600.0, false)).toString
+		Assert.assertEquals("3,600.000", effective);
+	}
+
+	@Test
+	def h_1_smart() {
+		val effective = (new SmartTime(3600.0, true)).toString
+		Assert.assertEquals("1.00 h", effective);
+	}
+
+	@Test
+	def h_max_default() {
+		val effective = (new SmartTime(99999.999, false)).toString
+		Assert.assertEquals("99,999.999", effective);
+	}
+
+	@Test
+	def h_max_smart() {
+		val effective = (new SmartTime(99999.999, true)).toString
+		Assert.assertEquals("27.78 h", effective);
+	}
+
+	@Test
+	def h_higher_than_max_default() {
+		// larger than format mask
+		// grouping separator applied, even if not specified in format mask
+		val effective = (new SmartTime(100000000.0, false)).toString
+		Assert.assertEquals("100,000,000.000", effective);
+	}
+
+	@Test
+	def h_higher_than_max_smart() {
+		// larger than format mask
+		// no grouping separator applied (that's ok)
+		val effective = (new SmartTime(100000000.0, true)).toString
+		Assert.assertEquals("27777.78 h", effective);
+	}
+}
\ No newline at end of file