diff --git a/DESCRIPTION b/DESCRIPTION
index 1e749871a7fab6a8c4bf6dace057aba141d29dc3..7db4065a84bd21f3aea017b70fcb109c3c1e1153 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -45,6 +45,7 @@ Suggests:
     pander,
     kableExtra,
     magrittr,
-    tibble
+    tibble,
+    testthat
 VignetteBuilder: knitr
 Roxygen: list(markdown = TRUE)
diff --git a/tests/testthat.R b/tests/testthat.R
new file mode 100644
index 0000000000000000000000000000000000000000..ec93ddba512575a0df2746f0163477cddbc05496
--- /dev/null
+++ b/tests/testthat.R
@@ -0,0 +1,7 @@
+library(testthat)
+library(LifeInsuranceContracts)
+library(MortalityTables)
+mortalityTables.load("Austria_Census")
+mortalityTables.load("Austria_Annuities_AVOe2005R")
+
+test_check("LifeInsuranceContracts")
diff --git a/tests/testthat/test-CF-Annuity-Deferred.R b/tests/testthat/test-CF-Annuity-Deferred.R
new file mode 100644
index 0000000000000000000000000000000000000000..bfc70ac4b40eafa95afc0a3dc910b405f658bd20
--- /dev/null
+++ b/tests/testthat/test-CF-Annuity-Deferred.R
@@ -0,0 +1,41 @@
+test_that("Deferred Annuity Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Annuities_AVOe2005R")
+
+    Tarif.DefAnnuity = InsuranceTarif$new(
+        name = "Example Tariff - Deferred Annuity",
+        type = "annuity",
+        tarif = "Life1",
+        desc = "A deferred annuity (life-long payments start at age 65) with reg. premiums",
+
+        policyPeriod = function(params, values) { 120 - params$ContractData$age},
+        deferralPeriod = function(params, values) { 65 - params$ContractData$age},
+        premiumPeriod = function(params, values) { 65 - params$ContractData$age},
+        premiumRefund = 1,
+
+        mortalityTable = AVOe2005R.unisex,
+        i = 0.005
+    )
+    Contract.DefAnnuity = InsuranceContract$new(
+        tarif = Tarif.DefAnnuity,
+        age = 40, YOB = 1980,
+        sumInsured = 1200,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.DefAnnuity$Parameters$ContractData$policyPeriod, 80)
+    expect_equal(Contract.DefAnnuity$Parameters$ContractData$deferralPeriod, 25)
+    expect_equal(Contract.DefAnnuity$Parameters$ContractData$premiumPeriod, 25)
+
+
+    expect_true(all(Contract.DefAnnuity$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_GrossPremium, -death_Refund_past) == 0))
+
+    # 25 years premium cash flow
+    expect_equal(Contract.DefAnnuity$Values$cashFlows$premiums_advance, c(rep(1, 25), rep(0, 56)))
+    # premium payment start after 25 years
+    expect_equal(Contract.DefAnnuity$Values$cashFlows$survival_advance, c(rep(0, 25), rep(1, 55),0))
+    # premium payment start after 25 years
+    expect_equal(Contract.DefAnnuity$Values$cashFlows$death_GrossPremium, c(1:25, rep(25, 55),0))
+    # death refund flag
+    expect_equal(Contract.DefAnnuity$Values$cashFlows$death_Refund_past, c(rep(1, 80), 0))
+})
diff --git a/tests/testthat/test-CF-Annuity.R b/tests/testthat/test-CF-Annuity.R
new file mode 100644
index 0000000000000000000000000000000000000000..ed4a930e8c8c4b87ae637a02da9443c9823f6ace
--- /dev/null
+++ b/tests/testthat/test-CF-Annuity.R
@@ -0,0 +1,35 @@
+test_that("Annuity Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Annuities_AVOe2005R")
+
+    Tarif.Annuity = InsuranceTarif$new(
+        name = "Example Tariff - Immediate Annuity",
+        type = "annuity",
+        tarif = "Ann1",
+        desc = "An annuity with single-premium",
+        premiumPeriod = 1,
+
+        mortalityTable = AVOe2005R.unisex,
+        i = 0.005
+    )
+    Contract.Annuity = InsuranceContract$new(
+        tarif = Tarif.Annuity,
+        age = 65, YOB = 1955,
+        sumInsured = 1200,
+        policyPeriod = 55,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.Annuity$Parameters$ContractData$policyPeriod, 55)
+    expect_equal(Contract.Annuity$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.Annuity$Parameters$ContractData$premiumPeriod, 1)
+
+
+    expect_true(all(Contract.Annuity$Values$cashFlows %>% select(-premiums_advance, -survival_advance) == 0))
+
+    # 1 year premium cash flow
+    expect_equal(Contract.Annuity$Values$cashFlows$premiums_advance, c(1, rep(0, 55)))
+    # premium payment start immediately for the whole contract period
+    expect_equal(Contract.Annuity$Values$cashFlows$survival_advance, c(rep(1, 55), 0))
+})
+
diff --git a/tests/testthat/test-CF-DreadDisease.R b/tests/testthat/test-CF-DreadDisease.R
new file mode 100644
index 0000000000000000000000000000000000000000..4f5562deedc4674703cf6348414534efd7e3a635
--- /dev/null
+++ b/tests/testthat/test-CF-DreadDisease.R
@@ -0,0 +1,80 @@
+test_that("Dread-Disease Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    # An example dread-disease tariff, morbidity is assumed linearly increasing with age
+    ddTable = mortalityTable.period(name = "Linear dread-disease table",
+                                    ages = 0:100, deathProbs = 0:100/500)
+    Tarif.DreadDisease = InsuranceTarif$new(
+        name = "Example Tariff - Dread-Disease",
+        type = "dread-disease",
+        tarif = "DD1",
+        desc = "A dread disease insurance with a lump-sum payment upon diagnosis",
+
+        sumInsured = 50000,
+        mortalityTable = mort.AT.census.2011.unisex,
+        invalidityTable = ddTable,
+        i = 0.005
+    )
+
+    Contract.DreadDisease = InsuranceContract$new(
+        tarif = Tarif.DreadDisease,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.DreadDisease$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.DreadDisease$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.DreadDisease$Parameters$ContractData$premiumPeriod, 20)
+
+
+    expect_true(all(Contract.DreadDisease$Values$cashFlows %>% select(-premiums_advance, -disease_SumInsured) == 0))
+
+    expect_equal(Contract.DreadDisease$Values$cashFlows$premiums_advance, c(rep(1, 20), 0))
+    expect_equal(Contract.DreadDisease$Values$cashFlows$disease_SumInsured, c(rep(1, 20), 0))
+})
+
+""
+test_that("Endowment + Dread-Disease Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    # An example dread-disease tariff, morbidity is assumed linearly increasing with age
+    ddTable = mortalityTable.period(name = "Linear dread-disease table",
+                                    ages = 0:100, deathProbs = 0:100/500)
+    Tarif.EndowDreadDisease = InsuranceTarif$new(
+        name = "Example Tariff - Endowment + Dread-Disease",
+        type = "endowment + dread-disease",
+        tarif = "EnDD1",
+        desc = "An endowment and dread disease insurance with a lump-sum payment upon diagnosis",
+
+        sumInsured = 50000,
+        mortalityTable = mort.AT.census.2011.unisex,
+        invalidityTable = ddTable,
+        invalidityEndsContract = TRUE,
+        i = 0.005
+    )
+
+    Contract.EndowDreadDisease = InsuranceContract$new(
+        tarif = Tarif.EndowDreadDisease,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.EndowDreadDisease$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.EndowDreadDisease$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.EndowDreadDisease$Parameters$ContractData$premiumPeriod, 20)
+
+
+    expect_true(all(Contract.EndowDreadDisease$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_SumInsured, -death_PremiumFree, -disease_SumInsured) == 0))
+
+    expect_equal(Contract.EndowDreadDisease$Values$cashFlows$premiums_advance, c(rep(1, 20), 0))
+    expect_equal(Contract.EndowDreadDisease$Values$cashFlows$survival_advance, c(rep(0, 20), 1))
+    expect_equal(Contract.EndowDreadDisease$Values$cashFlows$death_SumInsured, c(rep(1, 20), 0))
+    expect_equal(Contract.EndowDreadDisease$Values$cashFlows$disease_SumInsured, c(rep(1, 20), 0))
+    expect_equal(Contract.EndowDreadDisease$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0))
+
+})
+
diff --git a/tests/testthat/test-CF-Endowment-SP.R b/tests/testthat/test-CF-Endowment-SP.R
new file mode 100644
index 0000000000000000000000000000000000000000..113bf85a5d0d1017b017595b7ebcc224161e8aa6
--- /dev/null
+++ b/tests/testthat/test-CF-Endowment-SP.R
@@ -0,0 +1,32 @@
+test_that("Endowment Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    Tarif.Endowment.SP = InsuranceTarif$new(
+        name = "Example Tariff - Endowment Single Premium",
+        type = "endowment",
+        tarif = "E1-SP",
+        desc = "An endowment with single premiums (standard tariff)",
+        premiumPeriod = 1,
+        mortalityTable = mort.AT.census.2011.unisex,
+        i = 0.005
+    )
+    Contract.Endowment.SP = InsuranceContract$new(
+        tarif = Tarif.Endowment.SP,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.Endowment.SP$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.Endowment.SP$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.Endowment.SP$Parameters$ContractData$premiumPeriod, 1)
+
+
+    expect_true(all(Contract.Endowment.SP$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_SumInsured, -death_PremiumFree) == 0))
+
+    expect_equal(Contract.Endowment.SP$Values$cashFlows$premiums_advance, c(1, rep(0, 20)))
+    expect_equal(Contract.Endowment.SP$Values$cashFlows$survival_advance, c(rep(0, 20), 1))
+    expect_equal(Contract.Endowment.SP$Values$cashFlows$death_SumInsured, c(rep(1, 20),0))
+    expect_equal(Contract.Endowment.SP$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0))
+})
diff --git a/tests/testthat/test-CF-Endowment.R b/tests/testthat/test-CF-Endowment.R
new file mode 100644
index 0000000000000000000000000000000000000000..65715c7837f62c7f406b42dd6ee42d0acd9674da
--- /dev/null
+++ b/tests/testthat/test-CF-Endowment.R
@@ -0,0 +1,32 @@
+test_that("Endowment Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    Tarif.Endowment = InsuranceTarif$new(
+        name = "Example Tariff - Endowment",
+        type = "endowment",
+        tarif = "E1-RP",
+        desc = "An endowment with regular premiums (standard tariff)",
+
+        mortalityTable = mort.AT.census.2011.unisex,
+        i = 0.005
+    )
+    Contract.Endowment = InsuranceContract$new(
+        tarif = Tarif.Endowment,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.Endowment$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.Endowment$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.Endowment$Parameters$ContractData$premiumPeriod, 20)
+
+
+    expect_true(all(Contract.Endowment$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_SumInsured, -death_PremiumFree) == 0))
+
+    expect_equal(Contract.Endowment$Values$cashFlows$premiums_advance, c(rep(1, 20), 0))
+    expect_equal(Contract.Endowment$Values$cashFlows$survival_advance, c(rep(0, 20), 1))
+    expect_equal(Contract.Endowment$Values$cashFlows$death_SumInsured, c(rep(1, 20),0))
+    expect_equal(Contract.Endowment$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0))
+})
diff --git a/tests/testthat/test-CF-Life.R b/tests/testthat/test-CF-Life.R
new file mode 100644
index 0000000000000000000000000000000000000000..714f6e0197e55f64bf1419f91b80f05a8e0bdced
--- /dev/null
+++ b/tests/testthat/test-CF-Life.R
@@ -0,0 +1,32 @@
+test_that("Term Life Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    Tarif.Life = InsuranceTarif$new(
+        name = "Example Tariff - Whole/Term Life",
+        type = "wholelife",
+        tarif = "Life1",
+        desc = "A whole or term life insurance with regular premiums",
+
+        mortalityTable = mort.AT.census.2011.unisex,
+        i = 0.005
+    )
+
+    Contract.Life = InsuranceContract$new(
+        tarif = Tarif.Life,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.Life$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.Life$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.Life$Parameters$ContractData$premiumPeriod, 20)
+
+
+    expect_true(all(Contract.Life$Values$cashFlows %>% select(-premiums_advance, -death_SumInsured, -death_PremiumFree) == 0))
+
+    expect_equal(Contract.Life$Values$cashFlows$premiums_advance, c(rep(1, 20), 0))
+    expect_equal(Contract.Life$Values$cashFlows$death_SumInsured, c(rep(1, 20), 0))
+    expect_equal(Contract.Life$Values$cashFlows$death_PremiumFree, c(rep(1, 20), 0))
+})
diff --git a/tests/testthat/test-CF-PureEndowment.R b/tests/testthat/test-CF-PureEndowment.R
new file mode 100644
index 0000000000000000000000000000000000000000..e51077889b16bab7d00883d2d4d1245c9aaa73fc
--- /dev/null
+++ b/tests/testthat/test-CF-PureEndowment.R
@@ -0,0 +1,33 @@
+test_that("Pure Endowment Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    Tarif.PureEnd = InsuranceTarif$new(
+        name = "Example Tariff - Pure Endowment",
+        type = "pureendowment",
+        tarif = "PE1-RP",
+        desc = "A pure endowment with regular premiums (standard tariff)",
+
+        mortalityTable = mort.AT.census.2011.unisex,
+        i = 0.005,
+        premiumRefund = 1
+    )
+    Contract.PureEnd = InsuranceContract$new(
+        tarif = Tarif.PureEnd,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.PureEnd$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.PureEnd$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.PureEnd$Parameters$ContractData$premiumPeriod, 20)
+
+
+    expect_true(all(Contract.PureEnd$Values$cashFlows %>% select(-premiums_advance, -survival_advance, -death_GrossPremium, -death_Refund_past) == 0))
+
+    expect_equal(Contract.PureEnd$Values$cashFlows$premiums_advance, c(rep(1, 20), 0))
+    expect_equal(Contract.PureEnd$Values$cashFlows$survival_advance, c(rep(0, 20), 1))
+    expect_equal(Contract.PureEnd$Values$cashFlows$death_GrossPremium, c(1:20,0))
+    expect_equal(Contract.PureEnd$Values$cashFlows$death_Refund_past, c(rep(1, 20), 0))
+})
diff --git a/tests/testthat/test-CF-TermeFixe.R b/tests/testthat/test-CF-TermeFixe.R
new file mode 100644
index 0000000000000000000000000000000000000000..d103657244082cae2cbee76b43673b83251eeb39
--- /dev/null
+++ b/tests/testthat/test-CF-TermeFixe.R
@@ -0,0 +1,30 @@
+test_that("Termfix Cash Flows", {
+    library(MortalityTables)
+    mortalityTables.load("Austria_Census")
+
+    Tarif.Termfix = InsuranceTarif$new(
+        name = "Example Tariff - Terme Fixe",
+        type = "terme-fix",
+        tarif = "TF",
+        desc = "A termfix insurance with regular premiums",
+
+        mortalityTable = mort.AT.census.2011.unisex,
+        i = 0.005
+    )
+    Contract.Termfix = InsuranceContract$new(
+        tarif = Tarif.Termfix,
+        age = 40, policyPeriod = 20,
+        sumInsured = 10000,
+        contractClosing = as.Date("2020-09-01"),
+        calculate = "cashflows"
+    )
+    expect_equal(Contract.Termfix$Parameters$ContractData$policyPeriod, 20)
+    expect_equal(Contract.Termfix$Parameters$ContractData$deferralPeriod, 0)
+    expect_equal(Contract.Termfix$Parameters$ContractData$premiumPeriod, 20)
+
+
+    expect_true(all(Contract.Termfix$Values$cashFlows %>% select(-premiums_advance, -guaranteed_advance) == 0))
+
+    expect_equal(Contract.Termfix$Values$cashFlows$premiums_advance, c(rep(1, 20), 0))
+    expect_equal(Contract.Termfix$Values$cashFlows$guaranteed_advance, c(rep(0, 20), 1))
+})
diff --git a/tests/testthat/test-Cost-Initialization.R b/tests/testthat/test-Cost-Initialization.R
new file mode 100644
index 0000000000000000000000000000000000000000..da277efe48aef462f817a38df372bd3e318d63d3
--- /dev/null
+++ b/tests/testthat/test-Cost-Initialization.R
@@ -0,0 +1,28 @@
+test_that("multiplication works", {
+    c1 = initializeCosts(
+        alpha = 0.04,
+        Zillmer = 0.025,
+        beta = 0.05,
+        gamma = 0.0005,
+        gamma.paidUp = 0.001,
+        gamma.premiumfree = 0.00075,
+        gamma.contract = 0.002,
+        unitcosts = 10,
+        unitcosts.PolicyPeriod = 12
+    )
+
+    # the above is the short form of:
+    c2 = initializeCosts()
+    c2[["alpha", "SumPremiums", "once"]] = 0.04
+    c2[["Zillmer", "SumPremiums", "once"]] = 0.025
+    c2[["beta", "GrossPremium", "PremiumPeriod"]] = 0.05
+    c2[["gamma", "SumInsured", "PremiumPeriod"]] = 0.0005
+    c2[["gamma_nopremiums", "SumInsured", "PolicyPeriod"]] = 0.001
+    c2[["gamma", "SumInsured", "PremiumFree"]] = 0.00075
+    c2[["gamma", "SumInsured", "PolicyPeriod"]] = 0.002
+    c2[["unitcosts", "Constant", "PremiumPeriod"]] = 10
+    c2[["unitcosts", "Constant", "PolicyPeriod"]] = 12
+
+    expect_equal(c1, c2)
+    expect_equal(c1, initializeCosts(c1))
+})