diff --git a/src/test/java/de/deadlocker8/budgetmaster/integration/NewTransactionTest.java b/src/test/java/de/deadlocker8/budgetmaster/integration/NewTransactionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..37d6da455906f8e2ff41f1bb3316e0bbb8aa8e46
--- /dev/null
+++ b/src/test/java/de/deadlocker8/budgetmaster/integration/NewTransactionTest.java
@@ -0,0 +1,149 @@
+package de.deadlocker8.budgetmaster.integration;
+
+import de.deadlocker8.budgetmaster.Main;
+import de.deadlocker8.budgetmaster.authentication.UserService;
+import de.deadlocker8.budgetmaster.integration.helpers.IntegrationTestHelper;
+import de.deadlocker8.budgetmaster.integration.helpers.SeleniumTest;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TestName;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
+import org.junit.runner.RunWith;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.firefox.FirefoxDriver;
+import org.openqa.selenium.firefox.FirefoxOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.web.server.LocalServerPort;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = Main.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
+@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
+@SeleniumTest
+public class NewTransactionTest
+{
+	private IntegrationTestHelper helper;
+	private WebDriver driver;
+
+	@LocalServerPort
+	int port;
+
+	@Rule
+	public TestName name = new TestName();
+
+	@Rule
+	public TestWatcher testWatcher = new TestWatcher()
+	{
+		@Override
+		protected void finished(Description description)
+		{
+			driver.quit();
+		}
+
+		@Override
+		protected void failed(Throwable e, Description description)
+		{
+			IntegrationTestHelper.saveScreenshots(driver, name, SearchTest.class);
+		}
+	};
+
+	@Before
+	public void prepare()
+	{
+		FirefoxOptions options = new FirefoxOptions();
+		options.setHeadless(false);
+		driver = new FirefoxDriver(options);
+
+		// prepare
+		helper = new IntegrationTestHelper(driver, port);
+		helper.start();
+		helper.login(UserService.DEFAULT_PASSWORD);
+		helper.hideBackupReminder();
+
+		String path = getClass().getClassLoader().getResource("SearchDatabase.json").getFile().replace("/", File.separator);
+		helper.uploadDatabase(path, Arrays.asList("DefaultAccount0815", "sfsdf"), Arrays.asList("DefaultAccount0815", "Account2"));
+
+		// open transactions page
+		driver.get(helper.getUrl() + "/transactions");
+		driver.findElement(By.id("button-new-transaction")).click();
+	}
+
+	@Test
+	public void newTransaction_normal_income()
+	{
+		// open new transaction page
+		driver.findElement(By.xpath("//div[contains(@class, 'new-transaction-button')]//a[contains(text(),'Transaction')]")).click();
+
+		String name = "My normal transaction";
+		String amount = "15.00";
+		String description = "Lorem Ipsum dolor sit amet";
+
+		// fill form
+		driver.findElement(By.id("transaction-name")).sendKeys(name);
+		driver.findElement(By.id("transaction-amount")).sendKeys(amount);
+		driver.findElement(By.id("transaction-description")).sendKeys(description);
+
+		// submit form
+		final WebElement buttonSubmit = driver.findElement(By.xpath("//button[@type='submit']"));
+		buttonSubmit.click();
+
+		WebDriverWait wait = new WebDriverWait(driver, 5);
+		wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(".headline-date")));
+
+		// assert
+		assertThat(driver.getCurrentUrl()).endsWith("/transactions");
+
+		List<WebElement> transactionsRows = driver.findElements(By.cssSelector(".transaction-container .hide-on-med-and-down.transaction-row-top"));
+		assertThat(transactionsRows).hasSize(2);
+
+		final WebElement row = transactionsRows.get(0);
+		final List<WebElement> columns = row.findElements(By.className("col"));
+		assertThat(columns).hasSize(6);
+
+		// check columns
+		final String dateString = new SimpleDateFormat("dd.MM.").format(new Date());
+		assertTransactionColumns(columns, dateString, "N", "rgb(255, 255, 255)", false, name, description, amount);
+	}
+
+	private void assertTransactionColumns(List<WebElement> columns, String shortDate, String categoryLetter, String categoryColor, boolean repeatIconVisible, String name, String description, String amount)
+	{
+		// date
+		assertThat(columns.get(0)).hasFieldOrPropertyWithValue("text", shortDate);
+
+		// category
+		final WebElement categoryCircle = columns.get(1).findElement(By.className("category-circle"));
+		assertThat(categoryCircle.getCssValue("background-color")).isEqualTo(categoryColor);
+		assertThat(categoryCircle.findElement(By.tagName("span"))).hasFieldOrPropertyWithValue("text", categoryLetter);
+
+		// icon
+		final List<WebElement> icons = columns.get(2).findElements(By.tagName("i"));
+		assertThat(icons).hasSize(1);
+		assertThat(icons.get(0).isDisplayed()).isEqualTo(repeatIconVisible);
+
+		// name
+		assertThat(columns.get(3).findElement(By.className("transaction-text")).getText())
+				.isEqualTo(name);
+
+		//description
+		assertThat(columns.get(3).findElement(By.className("italic")).getText())
+				.isEqualTo(description);
+
+		// amount
+		assertThat(columns.get(4).getText()).contains(amount);
+	}
+}
\ No newline at end of file