diff --git a/appveyor.yml b/appveyor.yml
index 2fca97e5..cce5ba08 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,7 +13,7 @@ environment:
 configuration:
   - Debug
   - Release
-version: 3.4.0.{build}
+version: 3.5.1.{build}
 
 init:
 - cmd: echo Project - %APPVEYOR_PROJECT_NAME%
diff --git a/src/PropertySheets/NativeProject.props b/src/PropertySheets/NativeProject.props
index 8d747535..e981516c 100644
--- a/src/PropertySheets/NativeProject.props
+++ b/src/PropertySheets/NativeProject.props
@@ -2,9 +2,12 @@
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ImportGroup Label="PropertySheets" />
   <PropertyGroup Label="Configuration">
-	<TargetPlatformVersion>8.1</TargetPlatformVersion>
-	<CharacterSet>Unicode</CharacterSet>
-	<PlatformToolset>v140</PlatformToolset>
+    <TargetPlatformVersion>8.1</TargetPlatformVersion>
+    <CharacterSet>Unicode</CharacterSet>
+    <PlatformToolset>v140</PlatformToolset>
+  </PropertyGroup>
+  <PropertyGroup>
+    <TargetExt>.lib</TargetExt>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <OutDir>$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
diff --git a/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj b/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj
index 96c529cd..40c58465 100644
--- a/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj
+++ b/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj
@@ -93,7 +93,7 @@
     </ClCompile>
     <Link>
       <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Spectre.libDataset.lib;Spectre.libGenetic.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libClassifier.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libClassifier.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libDataset.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -108,7 +108,7 @@
     </ClCompile>
     <Link>
       <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Spectre.libDataset.lib;Spectre.libGenetic.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libClassifier.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libClassifier.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libDataset.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -127,7 +127,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Spectre.libDataset.lib;Spectre.libGenetic.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libClassifier.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libClassifier.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libDataset.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -146,7 +146,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Spectre.libDataset.lib;Spectre.libGenetic.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libClassifier.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libClassifier.lib;Spectre.libFunctional.lib;Spectre.libException.lib;Spectre.libDataset.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemGroup>
@@ -177,4 +177,4 @@
     <Error Condition="!Exists('..\packages\opencv3.3.0.0.1\build\native\opencv3.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\opencv3.3.0.0.1\build\native\opencv3.props'))" />
     <Error Condition="!Exists('..\packages\opencv3.3.0.0.1\build\native\opencv3.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\opencv3.3.0.0.1\build\native\opencv3.targets'))" />
   </Target>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj.filters b/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj.filters
index 329c0ecf..b7c938e4 100644
--- a/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj.filters
+++ b/src/Spectre.libClassifier.Tests/Spectre.libClassifier.Tests.vcxproj.filters
@@ -39,8 +39,11 @@
     <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\gmock\gmock-all.cc">
       <Filter>Source Files</Filter>
     </ClCompile>
+    <ClCompile Include="SplittedOpenCVDatasetTest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
   </ItemGroup>
   <ItemGroup>
     <None Include="packages.config" />
   </ItemGroup>
-</Project>
+</Project>
\ No newline at end of file
diff --git a/src/Spectre.libGaussianMixtureModelling/Spectre.libGaussianMixtureModelling.vcxproj b/src/Spectre.libGaussianMixtureModelling/Spectre.libGaussianMixtureModelling.vcxproj
index 2c40d0c3..053028f5 100644
--- a/src/Spectre.libGaussianMixtureModelling/Spectre.libGaussianMixtureModelling.vcxproj
+++ b/src/Spectre.libGaussianMixtureModelling/Spectre.libGaussianMixtureModelling.vcxproj
@@ -101,7 +101,8 @@
       <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
       <TreatWarningAsError>true</TreatWarningAsError>
       <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
-      <AdditionalIncludeDirectories>$(SolutionDir)Common;</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>
+      </AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
@@ -134,7 +135,7 @@
       <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
       <TreatWarningAsError>true</TreatWarningAsError>
       <OpenMPSupport>false</OpenMPSupport>
-      <AdditionalIncludeDirectories>$(SolutionDir)Common;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalIncludeDirectories>%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
     </ClCompile>
     <Link>
       <SubSystem>Windows</SubSystem>
diff --git a/src/Spectre.libGenetic.Tests/Spectre.libGenetic.Tests.vcxproj b/src/Spectre.libGenetic.Tests/Spectre.libGenetic.Tests.vcxproj
index 8074b42c..fddf582c 100644
--- a/src/Spectre.libGenetic.Tests/Spectre.libGenetic.Tests.vcxproj
+++ b/src/Spectre.libGenetic.Tests/Spectre.libGenetic.Tests.vcxproj
@@ -88,7 +88,7 @@
     </ClCompile>
     <Link>
       <AdditionalLibraryDirectories>$(TargetDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Spectre.libStatistics.lib;Spectre.libGenetic.lib;Spectre.libException.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libGenetic.lib;Spectre.libException.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -122,7 +122,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <AdditionalLibraryDirectories>$(TargetDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
-      <AdditionalDependencies>Spectre.libStatistics.lib;Spectre.libGenetic.lib;Spectre.libException.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libGenetic.lib;Spectre.libException.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
diff --git a/src/Spectre.libStatistics.Tests/Spectre.libStatistics.Tests.vcxproj b/src/Spectre.libStatistics.Tests/Spectre.libStatistics.Tests.vcxproj
index 4fa32653..83a49d3d 100644
--- a/src/Spectre.libStatistics.Tests/Spectre.libStatistics.Tests.vcxproj
+++ b/src/Spectre.libStatistics.Tests/Spectre.libStatistics.Tests.vcxproj
@@ -82,7 +82,7 @@
       <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
-      <AdditionalDependencies>Spectre.libDataset.lib;Spectre.libStatistics.lib;Spectre.libException.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libStatistics.lib;Spectre.libException.lib;Spectre.libDataset.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
@@ -108,7 +108,7 @@
     <Link>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
-      <AdditionalDependencies>Spectre.libDataset.lib;Spectre.libStatistics.lib;Spectre.libException.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+      <AdditionalDependencies>Spectre.libStatistics.lib;Spectre.libException.lib;Spectre.libDataset.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
diff --git a/src/Spectre.libWavelet.Tests/ConvolutionTest.cpp b/src/Spectre.libWavelet.Tests/ConvolutionTest.cpp
new file mode 100644
index 00000000..51841ba4
--- /dev/null
+++ b/src/Spectre.libWavelet.Tests/ConvolutionTest.cpp
@@ -0,0 +1,46 @@
+/*
+* ConvolutionTest.cpp
+* Tests convolution of the signal with given filter.
+*
+Copyright 2018 Michal Gallus
+
+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.
+*/
+
+#include <gtest/gtest.h>
+#include "Spectre.libWavelet\Convolution.h"
+
+namespace
+{
+    using namespace spectre::algorithm::wavelet;
+
+    TEST(ConvolutionInitialization, initializes)
+    {
+        EXPECT_NO_THROW(Convolution());
+    }
+
+    class ConvolutionTest : public ::testing::Test
+    {
+    protected:
+        Convolution convolution;
+    };
+
+    TEST_F(ConvolutionTest, properly_convolves_the_kernel_over_a_signal)
+    {
+        Signal signal = { 1.0, 2.0, 3.0, 4.0 };
+        Signal kernel = { -0.5, 1.0 };
+        Signal result = convolution.Convolve(kernel, signal);
+        Signal correctResult = { -0.5, 0.0, 0.5, 1.0 };
+        ASSERT_EQ(correctResult, result);
+    }
+}
diff --git a/src/Spectre.libWavelet.Tests/MeanAbsoluteDeviationNoiseEstimatorTest.cpp b/src/Spectre.libWavelet.Tests/MeanAbsoluteDeviationNoiseEstimatorTest.cpp
new file mode 100644
index 00000000..11e46be2
--- /dev/null
+++ b/src/Spectre.libWavelet.Tests/MeanAbsoluteDeviationNoiseEstimatorTest.cpp
@@ -0,0 +1,48 @@
+/*
+* MeanAbsoluteDeviationNoiseEstimatorTest.cpp
+* Tests Mean Absolute Deviation noise estimator.
+*
+Copyright 2018 Michal Gallus
+
+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.
+*/
+
+#include <gtest/gtest.h>
+#include "Spectre.libWavelet\MeanAbsoluteDeviationNoiseEstimator.h"
+
+namespace
+{
+    using namespace spectre::algorithm::wavelet;
+
+    TEST(MeanAbsoluteDeviationNoiseEstimatorInitialization, initializes)
+    {
+        EXPECT_NO_THROW(MeanAbsoluteDeviationNoiseEstimator(5.0));
+        EXPECT_NO_THROW(MeanAbsoluteDeviationNoiseEstimator());
+    }
+
+    class MeanAbsoluteDeviationNoiseEstimatorTest : public ::testing::Test
+    {
+    protected:
+        MeanAbsoluteDeviationNoiseEstimator estimator;
+    };
+
+    TEST_F(MeanAbsoluteDeviationNoiseEstimatorTest, estimates_noise_for_regular_input)
+    {
+        Signal signal = { 1.0f, 2.0f, 3.0f };
+        DataType maxAbsoluteError = 0.0001;
+        constexpr DataType result = static_cast<DataType>(1.4650890114825907);
+
+        DataType estimate = estimator.Estimate(signal);
+        ASSERT_NEAR(estimate, result, maxAbsoluteError);
+    }
+}
diff --git a/src/Spectre.libWavelet.Tests/SoftThresholderTest.cpp b/src/Spectre.libWavelet.Tests/SoftThresholderTest.cpp
new file mode 100644
index 00000000..9e054fd2
--- /dev/null
+++ b/src/Spectre.libWavelet.Tests/SoftThresholderTest.cpp
@@ -0,0 +1,49 @@
+/*
+* SoftThresholderTest.cpp
+* Testing of the soft tresholding.
+*
+Copyright 2018 Michal Gallus
+
+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.
+*/
+
+#include <gtest/gtest.h>
+#include "Spectre.libWavelet\SoftThresholder.h"
+
+namespace
+{
+    using namespace spectre::algorithm::wavelet;
+
+    TEST(SoftThresholderInitialization, initializes)
+    {
+        EXPECT_NO_THROW(SoftThresholder(0.0));
+        EXPECT_NO_THROW(SoftThresholder(9.0));
+        EXPECT_NO_THROW(SoftThresholder(-11.0));
+    }
+
+    class SoftThresholderTest : public ::testing::Test
+    {
+    public:
+        SoftThresholderTest() : tresholder(1.0) {}
+    protected:
+        SoftThresholder tresholder;
+    };
+
+    TEST_F(SoftThresholderTest, properly_tresholds_signal)
+    {
+        Signal input = { -1.0f, 2.0f, -3.0f, 4.0f };
+        Signal output = tresholder(input);
+        Signal correctOutput = { -0.0f, 1.0f, -2.0f, 3.0f };
+        ASSERT_EQ(correctOutput, output);
+    }
+}
diff --git a/src/Spectre.libWavelet.Tests/Spectre.libWavelet.Tests.vcxproj b/src/Spectre.libWavelet.Tests/Spectre.libWavelet.Tests.vcxproj
new file mode 100644
index 00000000..5546e159
--- /dev/null
+++ b/src/Spectre.libWavelet.Tests/Spectre.libWavelet.Tests.vcxproj
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{5B426532-B8C6-43BD-807A-CF772C731DC1}</ProjectGuid>
+    <RootNamespace>SpectrelibWaveletTests</RootNamespace>
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeTestProject.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeTestProject.props" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeTestProject.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeTestProject.props" />
+  </ImportGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <PreprocessorDefinitions>GTEST_LANG_CXX11=1;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(SolutionDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+    </ClCompile>
+    <Link>
+      <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>Spectre.libWavelet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <PreprocessorDefinitions>GTEST_LANG_CXX11=1;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(SolutionDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+    </ClCompile>
+    <Link>
+      <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>Spectre.libWavelet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <PreprocessorDefinitions>GTEST_LANG_CXX11=1;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(SolutionDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+    </ClCompile>
+    <Link>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>Spectre.libWavelet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <TreatWarningAsError>true</TreatWarningAsError>
+      <PreprocessorDefinitions>GTEST_LANG_CXX11=1;_UNICODE;UNICODE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(SolutionDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+    </ClCompile>
+    <Link>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalLibraryDirectories>$(OutputPath);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>Spectre.libWavelet.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\Common\Main.cpp" />
+    <ClCompile Include="MeanAbsoluteDeviationNoiseEstimatorTest.cpp" />
+    <ClCompile Include="ConvolutionTest.cpp" />
+    <ClCompile Include="SoftThresholderTest.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+    <Import Project="..\packages\gmock.1.7.0\build\native\gmock.targets" Condition="Exists('..\packages\gmock.1.7.0\build\native\gmock.targets')" />
+    <Import Project="..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets" Condition="Exists('..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets')" />
+  </ImportGroup>
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\gmock.1.7.0\build\native\gmock.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\gmock.1.7.0\build\native\gmock.targets'))" />
+    <Error Condition="!Exists('..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets'))" />
+  </Target>
+</Project>
\ No newline at end of file
diff --git a/src/Spectre.libWavelet.Tests/Spectre.libWavelet.Tests.vcxproj.filters b/src/Spectre.libWavelet.Tests/Spectre.libWavelet.Tests.vcxproj.filters
new file mode 100644
index 00000000..3c98b165
--- /dev/null
+++ b/src/Spectre.libWavelet.Tests/Spectre.libWavelet.Tests.vcxproj.filters
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="..\Common\Main.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\gtest\gtest-all.cc">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="$(MSBuildThisFileDirectory)..\..\lib\native\src\gmock\gmock-all.cc">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="MeanAbsoluteDeviationNoiseEstimatorTest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="SoftThresholderTest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="ConvolutionTest.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Spectre.libWavelet.Tests/packages.config b/src/Spectre.libWavelet.Tests/packages.config
new file mode 100644
index 00000000..38663efd
--- /dev/null
+++ b/src/Spectre.libWavelet.Tests/packages.config
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="gmock" version="1.7.0" targetFramework="native" />
+  <package id="Microsoft.Gsl" version="0.1.2.1" targetFramework="native" />
+</packages>
\ No newline at end of file
diff --git a/src/Spectre.libWavelet/Convolution.cpp b/src/Spectre.libWavelet/Convolution.cpp
new file mode 100644
index 00000000..52e863a3
--- /dev/null
+++ b/src/Spectre.libWavelet/Convolution.cpp
@@ -0,0 +1,42 @@
+/*
+ * Convolution.cpp
+ * Performs convolution over a 1D signal.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#include "Convolution.h"
+
+namespace spectre::algorithm::wavelet
+{
+Convolution::Convolution()
+{
+}
+
+Signal Convolution::Convolve(const Signal& kernel, const Signal &signal)
+{
+    std::vector<DataType> convolved(signal.size());
+    for (unsigned n = 0u; n < signal.size(); ++n)
+    {
+        size_t limit = kernel.size() < (n + 1) ? kernel.size() : (n + 1);
+        DataType result = 0.0f; // @sand3r-: speeds the computations up on vc++
+        for (unsigned i = 0u; i < limit; ++i)
+        {
+            result += kernel[i] * signal[n - i];
+        }
+        convolved[n] = result;
+    }
+    return convolved;
+}
+}
diff --git a/src/Spectre.libWavelet/Convolution.h b/src/Spectre.libWavelet/Convolution.h
new file mode 100644
index 00000000..b31bb2a9
--- /dev/null
+++ b/src/Spectre.libWavelet/Convolution.h
@@ -0,0 +1,44 @@
+/*
+ * Convolution.h
+ * Performs convolution over a 1D signal.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#pragma once
+#include <span.h>
+#include "DataTypes.h"
+
+namespace spectre::algorithm::wavelet
+{
+/// <summary>
+/// Filters the signal using rational transfer function.
+/// The denominator is set to 1.
+/// </summary>
+class Convolution
+{
+public:
+    /// <summary>
+    /// Initializes a new instance of the <see cref="Convolution"/> class.
+    /// </summary>
+    explicit Convolution();
+    /// <summary>
+    /// Convolves the signal using provided kernel.
+    /// </summary>
+    /// <param name="kernel">Kernel to be used.</param>
+    /// <param name="signal">Signal to be convolved.</param>
+    /// <returns>Filtered signal.</returns>
+    Signal Convolve(const Signal& kernel, const Signal& signal);
+};
+}
diff --git a/src/Spectre.libWavelet/DataTypes.h b/src/Spectre.libWavelet/DataTypes.h
new file mode 100644
index 00000000..0d2fa913
--- /dev/null
+++ b/src/Spectre.libWavelet/DataTypes.h
@@ -0,0 +1,26 @@
+/*
+ * DataTypes.h
+ * Contains data types used among the project
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#pragma once
+#include <vector>
+
+namespace spectre::algorithm::wavelet
+{
+using DataType = double;
+using Signal = std::vector<DataType>;
+}
diff --git a/src/Spectre.libWavelet/MeanAbsoluteDeviationNoiseEstimator.cpp b/src/Spectre.libWavelet/MeanAbsoluteDeviationNoiseEstimator.cpp
new file mode 100644
index 00000000..e5b87f60
--- /dev/null
+++ b/src/Spectre.libWavelet/MeanAbsoluteDeviationNoiseEstimator.cpp
@@ -0,0 +1,37 @@
+/*
+ * MeanAbsoluteDeviationNoiseEstimator.cpp
+ * Estimates mean absolute devation of noise in the signal.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#include "Spectre.libStatistics/Statistics.h"
+#include "MeanAbsoluteDeviationNoiseEstimator.h"
+
+namespace spectre::algorithm::wavelet
+{
+MeanAbsoluteDeviationNoiseEstimator::MeanAbsoluteDeviationNoiseEstimator(DataType multiplier) :
+    m_Multiplier(multiplier)
+{
+}
+
+DataType MeanAbsoluteDeviationNoiseEstimator::Estimate(const Signal& intensities) const
+{
+    constexpr auto locationOfThirdQuartileInNormalDistribution = static_cast<DataType>(.6745);
+    return m_Multiplier
+        * sqrt(2 * log(intensities.size()))
+        * statistics::simple_statistics::MeanAbsoluteDeviation(gsl::as_span(intensities))
+        / locationOfThirdQuartileInNormalDistribution;
+}
+}
\ No newline at end of file
diff --git a/src/Spectre.libWavelet/MeanAbsoluteDeviationNoiseEstimator.h b/src/Spectre.libWavelet/MeanAbsoluteDeviationNoiseEstimator.h
new file mode 100644
index 00000000..745af1c1
--- /dev/null
+++ b/src/Spectre.libWavelet/MeanAbsoluteDeviationNoiseEstimator.h
@@ -0,0 +1,45 @@
+/*
+ * MeanAbsoluteDeviationNoiseEstimator.h
+ * Estimates mean absolute devation of noise in the signal.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#pragma once
+#include "DataTypes.h"
+
+namespace spectre::algorithm::wavelet
+{
+/// <summary>
+/// Estimates the Mean-absolute devaition of the noise in the signal
+/// </summary>
+class MeanAbsoluteDeviationNoiseEstimator
+{
+public:
+    /// <summary>
+    /// Initializes a new instance of the
+    /// <see cref="MeanAbsoluteDeviationNoiseEstimator"/> class.
+    /// </summary>
+    /// <param name="multiplier">The multiplier used for computations.</param>
+    explicit MeanAbsoluteDeviationNoiseEstimator(DataType multiplier=1.0);
+    /// <summary>
+    /// Estimates the MAD of the noise.
+    /// </summary>
+    /// <param name="intensities">Signal to be analyzed.</param>
+    /// <returns>Estiamte of the noise in the signal.</returns>
+    DataType Estimate(const Signal& intensities) const;
+private:
+    const DataType m_Multiplier;
+};
+}
diff --git a/src/Spectre.libWavelet/PrecomputedDaubechiesCoefficients.h b/src/Spectre.libWavelet/PrecomputedDaubechiesCoefficients.h
new file mode 100644
index 00000000..5d915154
--- /dev/null
+++ b/src/Spectre.libWavelet/PrecomputedDaubechiesCoefficients.h
@@ -0,0 +1,75 @@
+/*
+ * PrecomputedDaubechiesCoefficients.h
+ * Contains precomputed daubechie filters coefficients.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#pragma once
+#include <array>
+#include "DataTypes.h"
+
+namespace spectre::algorithm::wavelet::precomputed
+{
+constexpr std::array<const DataType, 8> precomputedDaubechiesCoefficient{
+    0.23037781330889653408355854935508,
+    0.71484657055291567218091586255468,
+    0.63088076792985892105036782595562,
+    0.027983769416859854278767372193215,
+    0.18703481171909294711319660109439,
+    0.030841381835560857660460953866277,
+    0.032883011666885168799989713761533,
+    0.010597401785069055987764663484541
+};
+constexpr std::array<const DataType, 8> ReconstructionVlNumerator{
+    precomputedDaubechiesCoefficient[0],
+    precomputedDaubechiesCoefficient[1],
+    precomputedDaubechiesCoefficient[2],
+    -precomputedDaubechiesCoefficient[3],
+    -precomputedDaubechiesCoefficient[4],
+    precomputedDaubechiesCoefficient[5],
+    precomputedDaubechiesCoefficient[6],
+    -precomputedDaubechiesCoefficient[7]
+};
+constexpr std::array<const DataType, 8> DecompositionYhNumerator{
+    -precomputedDaubechiesCoefficient[0],
+    precomputedDaubechiesCoefficient[1],
+    -precomputedDaubechiesCoefficient[2],
+    -precomputedDaubechiesCoefficient[3],
+    precomputedDaubechiesCoefficient[4],
+    precomputedDaubechiesCoefficient[5],
+    -precomputedDaubechiesCoefficient[6],
+    -precomputedDaubechiesCoefficient[7]
+};
+constexpr std::array<const DataType, 8> DecompositionYlNumerator{
+    -precomputedDaubechiesCoefficient[7],
+    precomputedDaubechiesCoefficient[6],
+    precomputedDaubechiesCoefficient[5],
+    -precomputedDaubechiesCoefficient[4],
+    -precomputedDaubechiesCoefficient[3],
+    precomputedDaubechiesCoefficient[2],
+    precomputedDaubechiesCoefficient[1],
+    precomputedDaubechiesCoefficient[0]
+};
+constexpr std::array<const DataType, 8> ReconstructionVhNumerator{
+    -precomputedDaubechiesCoefficient[7],
+    -precomputedDaubechiesCoefficient[6],
+    precomputedDaubechiesCoefficient[5],
+    precomputedDaubechiesCoefficient[4],
+    -precomputedDaubechiesCoefficient[3],
+    -precomputedDaubechiesCoefficient[2],
+    precomputedDaubechiesCoefficient[1],
+    -precomputedDaubechiesCoefficient[0]
+};
+}
diff --git a/src/Spectre.libWavelet/SoftThresholder.cpp b/src/Spectre.libWavelet/SoftThresholder.cpp
new file mode 100644
index 00000000..83d44832
--- /dev/null
+++ b/src/Spectre.libWavelet/SoftThresholder.cpp
@@ -0,0 +1,38 @@
+/*
+ * SoftThresholder.cpp
+ * Performs a soft tresholding on the provided signal.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#include "Spectre.libFunctional/Transform.h"
+#include "SoftThresholder.h"
+
+namespace spectre::algorithm::wavelet
+{
+SoftThresholder::SoftThresholder(DataType threshold)
+    : m_Threshold(threshold)
+{
+}
+
+Signal SoftThresholder::operator()(const Signal &signal) const
+{
+    const auto& threshold = m_Threshold;
+    const auto thresholding = [threshold](DataType value)
+    {
+        return std::max(static_cast<DataType>(0), std::abs(value) - threshold) * (value < 0 ? -1 : 1);
+    };
+    return core::functional::transform(gsl::as_span(signal), thresholding);
+}
+}
diff --git a/src/Spectre.libWavelet/SoftThresholder.h b/src/Spectre.libWavelet/SoftThresholder.h
new file mode 100644
index 00000000..d97e786e
--- /dev/null
+++ b/src/Spectre.libWavelet/SoftThresholder.h
@@ -0,0 +1,44 @@
+/*
+ * SoftThresholder.h
+ * Performs a soft tresholding on the provided signal.
+ *
+   Copyright 2018 Michal Gallus
+
+   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.
+*/
+#pragma once
+#include "DataTypes.h"
+
+namespace spectre::algorithm::wavelet
+{
+/// <summary>
+/// Applies soft tresholding on the signal provided.
+/// </summary>
+class SoftThresholder
+{
+public:
+    /// <summary>
+    /// Initializes a new instance of the <see cref="SoftThresholder"/> class.
+    /// </summary>
+    /// <param name="threshold">Treshold to be used.</param>
+    explicit SoftThresholder(DataType threshold);
+    /// <summary>
+    /// Tresholds the signal
+    /// </summary>
+    /// <param name="signal">Signal to apply tresholding to.</param>
+    /// <returns>Tresholded signal.</returns>
+    Signal operator()(const Signal& signal) const;
+private:
+    const DataType m_Threshold;
+};
+}
diff --git a/src/Spectre.libWavelet/Spectre.libWavelet.vcxproj b/src/Spectre.libWavelet/Spectre.libWavelet.vcxproj
new file mode 100644
index 00000000..5253389e
--- /dev/null
+++ b/src/Spectre.libWavelet/Spectre.libWavelet.vcxproj
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>15.0</VCProjectVersion>
+    <ProjectGuid>{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}</ProjectGuid>
+    <RootNamespace>SpectreeWavelet</RootNamespace>
+    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
+    <ProjectName>Spectre.libWavelet</ProjectName>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>StaticLibrary</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v140</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeProject.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeProject.props" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeProject.props" />
+  </ImportGroup>
+  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+    <Import Project="..\PropertySheets\NativeProject.props" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <IntDir>$(Platform)$(Configuration)\</IntDir>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+      <TreatWarningAsError>true</TreatWarningAsError>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>Disabled</Optimization>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+      <TreatWarningAsError>true</TreatWarningAsError>
+    </ClCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+      <TreatWarningAsError>true</TreatWarningAsError>
+    </ClCompile>
+    <Link>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <WarningLevel>Level4</WarningLevel>
+      <Optimization>MaxSpeed</Optimization>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <AdditionalOptions>/std:c++latest %(AdditionalOptions)</AdditionalOptions>
+      <TreatWarningAsError>true</TreatWarningAsError>
+    </ClCompile>
+    <Link>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="Convolution.h" />
+    <ClInclude Include="DataTypes.h" />
+    <ClInclude Include="MeanAbsoluteDeviationNoiseEstimator.h" />
+    <ClInclude Include="PrecomputedDaubechiesCoefficients.h" />
+    <ClInclude Include="SoftThresholder.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Convolution.cpp" />
+    <ClCompile Include="MeanAbsoluteDeviationNoiseEstimator.cpp" />
+    <ClCompile Include="SoftThresholder.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+    <Import Project="..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets" Condition="Exists('..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets')" />
+    <Import Project="..\packages\opencv3.redist.3.0.0.1\build\native\opencv3.redist.targets" Condition="Exists('..\packages\opencv3.redist.3.0.0.1\build\native\opencv3.redist.targets')" />
+    <Import Project="..\packages\opencv3.3.0.0.1\build\native\opencv3.targets" Condition="Exists('..\packages\opencv3.3.0.0.1\build\native\opencv3.targets')" />
+  </ImportGroup>
+  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
+    <PropertyGroup>
+      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
+    </PropertyGroup>
+    <Error Condition="!Exists('..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Gsl.0.1.2.1\build\native\Microsoft.Gsl.targets'))" />
+    <Error Condition="!Exists('..\packages\opencv3.redist.3.0.0.1\build\native\opencv3.redist.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\opencv3.redist.3.0.0.1\build\native\opencv3.redist.targets'))" />
+    <Error Condition="!Exists('..\packages\opencv3.3.0.0.1\build\native\opencv3.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\opencv3.3.0.0.1\build\native\opencv3.props'))" />
+    <Error Condition="!Exists('..\packages\opencv3.3.0.0.1\build\native\opencv3.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\opencv3.3.0.0.1\build\native\opencv3.targets'))" />
+  </Target>
+</Project>
\ No newline at end of file
diff --git a/src/Spectre.libWavelet/Spectre.libWavelet.vcxproj.filters b/src/Spectre.libWavelet/Spectre.libWavelet.vcxproj.filters
new file mode 100644
index 00000000..bec02df2
--- /dev/null
+++ b/src/Spectre.libWavelet/Spectre.libWavelet.vcxproj.filters
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Source Files">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="Header Files">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
+    </Filter>
+    <Filter Include="Resource Files">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="MeanAbsoluteDeviationNoiseEstimator.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="DataTypes.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="PrecomputedDaubechiesCoefficients.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="SoftThresholder.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+    <ClInclude Include="Convolution.h">
+      <Filter>Header Files</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="MeanAbsoluteDeviationNoiseEstimator.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="SoftThresholder.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="Convolution.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="packages.config" />
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/src/Spectre.libWavelet/packages.config b/src/Spectre.libWavelet/packages.config
new file mode 100644
index 00000000..c9bdee33
--- /dev/null
+++ b/src/Spectre.libWavelet/packages.config
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<packages>
+  <package id="Microsoft.Gsl" version="0.1.2.1" targetFramework="native" />
+  <package id="opencv3" version="3.0.0.1" targetFramework="native" />
+  <package id="opencv3.redist" version="3.0.0.1" targetFramework="native" />
+</packages>
\ No newline at end of file
diff --git a/src/native-algorithms.sln b/src/native-algorithms.sln
index f2351571..76b40d37 100644
--- a/src/native-algorithms.sln
+++ b/src/native-algorithms.sln
@@ -1,12 +1,9 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
 # Visual Studio 15
-VisualStudioVersion = 15.0.27130.2010
+VisualStudioVersion = 15.0.26730.12
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libClustering", "Spectre.libClustering\Spectre.libClustering.vcxproj", "{450F225C-4610-4B20-84AE-2ED5B4C8D7C4}"
-	ProjectSection(ProjectDependencies) = postProject
-		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libClustering.Tests", "Spectre.libClustering.Tests\Spectre.libClustering.Tests.vcxproj", "{1C2E181F-EAB0-46AA-B096-8BC78D7D8DB3}"
 	ProjectSection(ProjectDependencies) = postProject
@@ -16,14 +13,8 @@ EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libDivik", "Spectre.libDivik\Spectre.libDivik.vcxproj", "{369BDAFF-9E57-40D0-830D-B9232F35E4F4}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libGenetic", "Spectre.libGenetic\Spectre.libGenetic.vcxproj", "{9786751A-6AE1-48D3-938D-4129D0399667}"
-	ProjectSection(ProjectDependencies) = postProject
-		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libDataset", "Spectre.libDataset\Spectre.libDataset.vcxproj", "{B7DB309D-3ED6-4771-993D-A1CF3A6436D9}"
-	ProjectSection(ProjectDependencies) = postProject
-		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libDataset.Tests", "Spectre.libDataset.Tests\Spectre.libDataset.Tests.vcxproj", "{E6B2EF6F-86BD-4E2C-B860-1B9F0D3B9556}"
 	ProjectSection(ProjectDependencies) = postProject
@@ -32,54 +23,43 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libDataset.Tests",
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libGaussianMixtureModelling.Tests", "Spectre.libGaussianMixtureModelling.Tests\Spectre.libGaussianMixtureModelling.Tests.vcxproj", "{2185C120-7B01-4E2E-B200-858A2D25C715}"
 	ProjectSection(ProjectDependencies) = postProject
-		{104D9A93-F6D7-4BF4-961F-7C52FEAEA77B} = {104D9A93-F6D7-4BF4-961F-7C52FEAEA77B}
+		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libGaussianMixtureModelling", "Spectre.libGaussianMixtureModelling\Spectre.libGaussianMixtureModelling.vcxproj", "{104D9A93-F6D7-4BF4-961F-7C52FEAEA77B}"
-	ProjectSection(ProjectDependencies) = postProject
-		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libException", "Spectre.libException\Spectre.libException.vcxproj", "{7417BF00-028B-4797-B58A-6058CA338493}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libGenetic.Tests", "Spectre.libGenetic.Tests\Spectre.libGenetic.Tests.vcxproj", "{F5FFC2E5-66F4-493A-8D77-D47128A719D9}"
 	ProjectSection(ProjectDependencies) = postProject
+		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
 		{9786751A-6AE1-48D3-938D-4129D0399667} = {9786751A-6AE1-48D3-938D-4129D0399667}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libClassifier", "Spectre.libClassifier\Spectre.libClassifier.vcxproj", "{5419AEEB-98B4-4D79-9FCA-A794200073FC}"
-	ProjectSection(ProjectDependencies) = postProject
-		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-		{7EB0161F-4E8A-4C72-BA18-31B554F411F2} = {7EB0161F-4E8A-4C72-BA18-31B554F411F2}
-		{B7DB309D-3ED6-4771-993D-A1CF3A6436D9} = {B7DB309D-3ED6-4771-993D-A1CF3A6436D9}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libClassifier.Tests", "Spectre.libClassifier.Tests\Spectre.libClassifier.Tests.vcxproj", "{B6B8D608-32E7-4F09-B91D-EA5832D74C07}"
 	ProjectSection(ProjectDependencies) = postProject
 		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-		{76542909-5FC8-405B-8E6D-D2E529162A7A} = {76542909-5FC8-405B-8E6D-D2E529162A7A}
-		{9786751A-6AE1-48D3-938D-4129D0399667} = {9786751A-6AE1-48D3-938D-4129D0399667}
 		{7EB0161F-4E8A-4C72-BA18-31B554F411F2} = {7EB0161F-4E8A-4C72-BA18-31B554F411F2}
+		{B7DB309D-3ED6-4771-993D-A1CF3A6436D9} = {B7DB309D-3ED6-4771-993D-A1CF3A6436D9}
 		{5419AEEB-98B4-4D79-9FCA-A794200073FC} = {5419AEEB-98B4-4D79-9FCA-A794200073FC}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libStatistics", "Spectre.libStatistics\Spectre.libStatistics.vcxproj", "{76542909-5FC8-405B-8E6D-D2E529162A7A}"
-	ProjectSection(ProjectDependencies) = postProject
-		{B7DB309D-3ED6-4771-993D-A1CF3A6436D9} = {B7DB309D-3ED6-4771-993D-A1CF3A6436D9}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libStatistics.Tests", "Spectre.libStatistics.Tests\Spectre.libStatistics.Tests.vcxproj", "{81F10DE8-B9EF-400F-B3A7-57F2AFF35A14}"
 	ProjectSection(ProjectDependencies) = postProject
+		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
 		{76542909-5FC8-405B-8E6D-D2E529162A7A} = {76542909-5FC8-405B-8E6D-D2E529162A7A}
+		{B7DB309D-3ED6-4771-993D-A1CF3A6436D9} = {B7DB309D-3ED6-4771-993D-A1CF3A6436D9}
 	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libFunctional", "Spectre.libFunctional\Spectre.libFunctional.vcxproj", "{7EB0161F-4E8A-4C72-BA18-31B554F411F2}"
-	ProjectSection(ProjectDependencies) = postProject
-		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
-	EndProjectSection
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libFunctional.Tests", "Spectre.libFunctional.Tests\Spectre.libFunctional.Tests.vcxproj", "{CF33269B-0876-4651-A8B9-2E32740C05C7}"
 	ProjectSection(ProjectDependencies) = postProject
+		{7417BF00-028B-4797-B58A-6058CA338493} = {7417BF00-028B-4797-B58A-6058CA338493}
 		{7EB0161F-4E8A-4C72-BA18-31B554F411F2} = {7EB0161F-4E8A-4C72-BA18-31B554F411F2}
 	EndProjectSection
 EndProject
@@ -93,6 +73,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "algorithm", "algorithm", "{
 EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "unsupervised", "unsupervised", "{1C5130A0-168B-41FA-911C-576D3034F160}"
 EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libWavelet", "Spectre.libWavelet\Spectre.libWavelet.vcxproj", "{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Spectre.libWavelet.Tests", "Spectre.libWavelet.Tests\Spectre.libWavelet.Tests.vcxproj", "{5B426532-B8C6-43BD-807A-CF772C731DC1}"
+	ProjectSection(ProjectDependencies) = postProject
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982} = {3BD3D898-F14B-4129-BAE5-6E3E83E9D982}
+	EndProjectSection
+EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 		Debug|Win32 = Debug|Win32
@@ -295,6 +282,29 @@ Global
 		{CF33269B-0876-4651-A8B9-2E32740C05C7}.Release|x64.Build.0 = Release|x64
 		{CF33269B-0876-4651-A8B9-2E32740C05C7}.Release|x86.ActiveCfg = Release|Win32
 		{CF33269B-0876-4651-A8B9-2E32740C05C7}.Release|x86.Build.0 = Release|Win32
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Debug|Win32.ActiveCfg = Debug|Win32
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Debug|Win32.Build.0 = Debug|Win32
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Debug|x64.ActiveCfg = Debug|x64
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Debug|x64.Build.0 = Debug|x64
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Debug|x86.ActiveCfg = Debug|x64
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Release|Win32.ActiveCfg = Release|Win32
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Release|Win32.Build.0 = Release|Win32
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Release|x64.ActiveCfg = Release|x64
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Release|x64.Build.0 = Release|x64
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Release|x86.ActiveCfg = Release|Win32
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982}.Release|x86.Build.0 = Release|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Debug|Win32.ActiveCfg = Debug|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Debug|Win32.Build.0 = Debug|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Debug|x64.ActiveCfg = Debug|x64
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Debug|x64.Build.0 = Debug|x64
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Debug|x86.ActiveCfg = Debug|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Debug|x86.Build.0 = Debug|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Release|Win32.ActiveCfg = Release|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Release|Win32.Build.0 = Release|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Release|x64.ActiveCfg = Release|x64
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Release|x64.Build.0 = Release|x64
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Release|x86.ActiveCfg = Release|Win32
+		{5B426532-B8C6-43BD-807A-CF772C731DC1}.Release|x86.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
@@ -316,6 +326,8 @@ Global
 		{81F10DE8-B9EF-400F-B3A7-57F2AFF35A14} = {161BFBEB-A19E-4F5C-A7C1-1AAF0A6DA3EC}
 		{7EB0161F-4E8A-4C72-BA18-31B554F411F2} = {A136EE60-7CFE-4FEF-8BF8-7CB9AFC94353}
 		{CF33269B-0876-4651-A8B9-2E32740C05C7} = {A136EE60-7CFE-4FEF-8BF8-7CB9AFC94353}
+		{3BD3D898-F14B-4129-BAE5-6E3E83E9D982} = {1006E08E-0DB2-4645-961A-1B1C902198C4}
+		{5B426532-B8C6-43BD-807A-CF772C731DC1} = {1006E08E-0DB2-4645-961A-1B1C902198C4}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {ED57AF8B-7937-40C6-9764-D313AB08FEC9}