diff --git a/.github/workflows/build-mac.yaml b/.github/workflows/build-mac.yaml
new file mode 100644
index 0000000..0da4ab6
--- /dev/null
+++ b/.github/workflows/build-mac.yaml
@@ -0,0 +1,49 @@
+name: Release Mpboot Mac
+on:
+  workflow_dispatch:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+  workflow_call:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+
+jobs:
+  build:
+    strategy:
+      fail-fast: false
+      matrix:
+        chipset_arch: ["sse4", "avx"]
+        os: [macos-13]
+    permissions:
+      contents: write
+    runs-on: ${{ matrix.os }}
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Setup cmake
+      uses: jwlawson/actions-setup-cmake@v1.13
+      with:
+        cmake-version: '3.16.x'
+
+    - name: Run cmake
+      run: cmake . -DIQTREE_FLAGS=${{ matrix.chipset_arch }}
+
+    - name: Build
+      run: make
+    
+    - name: Zip build artifact
+      run: zip -r mpboot-${{ matrix.chipset_arch }}-${{ matrix.os }}-${{ inputs.version }}.zip mpboot*
+
+    - name: Release
+      uses: softprops/action-gh-release@v1
+      with:
+        files: mpboot-${{ matrix.chipset_arch }}-${{ matrix.os }}-${{ inputs.version }}.zip
+        tag_name: ${{ inputs.version }}
+        draft: true
+        append_body: true
\ No newline at end of file
diff --git a/.github/workflows/build-ubuntu.yaml b/.github/workflows/build-ubuntu.yaml
new file mode 100644
index 0000000..ff035d9
--- /dev/null
+++ b/.github/workflows/build-ubuntu.yaml
@@ -0,0 +1,49 @@
+name: Release Mpboot Linux
+on:
+  workflow_dispatch:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+  workflow_call:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+
+jobs:
+  build:
+    strategy:
+      fail-fast: false
+      matrix:
+        chipset_arch: ["sse4", "avx"]
+        os: [ubuntu-latest]
+    permissions:
+      contents: write
+    runs-on: ${{ matrix.os }}
+    steps:
+    - uses: actions/checkout@v3
+
+    - name: Setup cmake
+      uses: jwlawson/actions-setup-cmake@v1.13
+      with:
+        cmake-version: '3.16.x'
+
+    - name: Run cmake
+      run: cmake . -DIQTREE_FLAGS=${{ matrix.chipset_arch }} -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
+
+    - name: Build
+      run: make
+    
+    - name: Zip build artifact
+      run: zip -r mpboot-${{ matrix.chipset_arch }}-${{ matrix.os }}-${{ inputs.version }}.zip mpboot*
+
+    - name: Release
+      uses: softprops/action-gh-release@v1
+      with:
+        files: mpboot-${{ matrix.chipset_arch }}-${{ matrix.os }}-${{ inputs.version }}.zip
+        tag_name: ${{ inputs.version }}
+        draft: true
+        append_body: true
\ No newline at end of file
diff --git a/.github/workflows/build-windows.yaml b/.github/workflows/build-windows.yaml
new file mode 100644
index 0000000..47758a5
--- /dev/null
+++ b/.github/workflows/build-windows.yaml
@@ -0,0 +1,62 @@
+name: Release Mpboot Window
+on:
+  workflow_dispatch:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+  workflow_call:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+        
+jobs:
+  build:
+    strategy:
+      fail-fast: false
+      matrix:
+        chipset_arch: ["sse4", "avx"]
+        os: [windows-latest]
+    permissions:
+      contents: write
+    runs-on: ${{ matrix.os }}
+    steps:
+    - uses: actions/checkout@v3
+
+
+    - name: install tdm-gcc (v10.3.0)
+      run: |
+        mkdir tdm 
+        cd tdm
+        curl -LJ -o tdm64-gcc.exe https://github.com/jmeubank/tdm-gcc/releases/download/v10.3.0-tdm64-2/tdm64-gcc-10.3.0-2.exe
+        7z e tdm64-gcc.exe
+        mkdir install
+        forfiles /M *.tar.xz /C "cmd /C 7z x @file -y"
+        forfiles /M *.tar /C "cmd /C 7z x @file -oinstall -y"
+        cd install
+        cd bin
+        echo "$PWD"
+    - name: test tdm-gcc
+      run: |
+        gcc --version
+        echo $env:PATH 
+
+    - name: Run cmake
+      run: cmake . -G "MinGW Makefiles" -DIQTREE_FLAGS=${{ matrix.chipset_arch }} -DCMAKE_CXX_COMPILER="D:/a/mpboot/mpboot/tdm/install/bin/g++.exe" -DCMAKE_C_COMPILER="D:/a/mpboot/mpboot/tdm/install/bin/gcc.exe"
+
+    - name: Build
+      run: make
+    
+    - name: Zip build artifact
+      run: 7z a mpboot-${{ matrix.chipset_arch }}-${{ matrix.os }}-${{ inputs.version }}.7z mpboot*
+
+    - name: Release
+      uses: softprops/action-gh-release@v1
+      with:
+        files: mpboot-${{ matrix.chipset_arch }}-${{ matrix.os }}-${{ inputs.version }}.7z
+        tag_name: ${{ inputs.version }}
+        draft: true
+        append_body: true
\ No newline at end of file
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
new file mode 100644
index 0000000..26a9cd2
--- /dev/null
+++ b/.github/workflows/release.yaml
@@ -0,0 +1,28 @@
+name: Release Mpboot
+on:
+  workflow_dispatch:
+    inputs:
+      version:
+        required: true
+        type: string
+        description: Sematic versioning
+
+jobs:
+  windows:
+    permissions:
+      contents: write
+    uses: ./.github/workflows/build-windows.yaml
+    with:
+      version: ${{ inputs.version }}
+  ubuntu:
+    permissions:
+      contents: write
+    uses: ./.github/workflows/build-ubuntu.yaml
+    with:
+      version: ${{ inputs.version }}
+  mac:
+    permissions:
+      contents: write
+    uses: ./.github/workflows/build-mac.yaml
+    with:
+      version: ${{ inputs.version }}
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index fce4a26..ebb6506 100755
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -108,7 +108,7 @@ if (CMAKE_COMPILER_IS_GNUCXX)
 	message("Compiler      : GNU Compiler (gcc)")
 	set(GCC "TRUE")
 #	set(COMBINED_FLAGS "-Wall -Wno-unused-function -Wno-sign-compare -pedantic -D_GNU_SOURCE -fms-extensions -Wno-deprecated")
-#	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
 	set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g0")
 	set(CMAKE_C_FLAGS_RELEASE "-O3 -g0")
 elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
diff --git a/README.md b/README.md
index d8c5336..fb75825 100644
--- a/README.md
+++ b/README.md
@@ -1,38 +1,137 @@
-# mpboot
-MPBoot: Fast phylogenetic maximum parsimony tree inference and bootstrap approximation
-
-## **COMPILING INSTRUCTION SINCE 2020**
-* Clone the source code, unzip it, and rename to **source**
-* Create folder **build** outside folder **source**
-* Change directory to **build**
-* Run **cmake** command:
-
-**cmake ../source -DIQTREE_FLAGS=sse4 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++**
-* Replace **sse4** by **avx** in above command if you decide to run MPBoot on AVX architecture
-* Run **make**
-* You will find the executable named **mpboot** once the **make** command is done.
-
-<hr>
-<br><br><br>
-
-
-> ## **COMPILING INSTRUCTION PRIOR TO 2020**
-> * Clone the source code, unzip it, and rename to **source**
-> * Change directory to **source**, run following commands to update the sub-repository
-> 
-> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**git submodule init**
-> 
-> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**git submodule update**
-> 
-> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**cd pllrepo**
-> 
-> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;**git checkout subufbootmp**
-> 
-> * Create folder **build** outside folder **source**
-> * Change directory to **build**
-> * Run **cmake** command:
-> 
-> **cmake ../source -DIQTREE_FLAGS=sse4 -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++**
-> * Replace **sse4** by **avx** in above command if you decide to run MPBoot on AVX architecture
-> * Run **make**
-> * You will find the executable named **mpboot** once the **make** command is done.
+# Compilation guide
+## MPBoot
+### Downloading source code
+You can clone the source code from GitHub with:
+
+`git clone https://github.com/diepthihoang/mpboot.git`
+### Compiling under Linux
+1. Create folder **build** outside folder **mpboot**.
+2. Open Terminal.
+3. Change directory to **build**
+4. Configure source code with CMake:  
+`cmake ../mpboot -DIQTREE_FLAGS=avx -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++`
+> Replace avx by sse4 in above command if you decide to run MPBoot on SSE architecture
+
+5. Run command `make -j4` to compile source code with 4 processes:  
+> Option **j** specifies the number of processes used to compile source code with **make**.  
+  
+The compiler will generate an executable file named **mpboot-avx** 
+> In case of running MPBoot on SSE architecture, the executable file is named **mpboot**.
+
+6. To analyst file **example.phy**, run command:  
+`./mpboot-avx -s example.phy`
+
+### Compiling under Mac OS X
+1. Create folder **build** outside folder **mpboot**.
+2. Open a Terminal.
+3. Change directory to **build**
+4. Configure source code with CMake:  
+`cmake ../mpboot -DIQTREE_FLAGS=avx`
+> Replace avx by sse4 in above command if you decide to run MPBoot on SSE architecture
+
+5. Run command `make -j4` to compile source code with 4 processes:  
+> Option **j** specifies the number of processes used to compile source code with **make**.  
+  
+The compiler will generate an executable file named **mpboot-avx** 
+> In case of running MPBoot on SSE architecture, the executable file is named **mpboot**.
+
+6. To analyst file **example.phy**, run command:  
+`./mpboot-avx -s example.phy`
+
+### Compiling under Windows
+* Requirements:  
+  * cmake version >= 3.21
+  * TDM-GCC
+1. Create folder **build** outside folder **mpboot**.
+2. Open a Terminal.
+3. Change directory to **build**
+4. Configure source code with CMake:  
+`cmake -G "MinGW Makefiles" -DIQTREE_FLAGS=avx ../mpboot`
+> Replace avx by sse4 in above command if you decide to run MPBoot on SSE architecture.  
+> Due to having conflicts with **Vectorization**, please not using **Clang** to configure source code.
+
+5. Run command `mingw32-make -j4` to compile source code with 4 processes:  
+> Option **j** specifies the number of processes used to compile source code with **make**.
+  
+The compiler will generate two executable files named **mpboot-avx** and **mpboot-avx-click**
+> In case of running MPBoot on SSE architecture, the executable files are named **mpboot** and **mpboot-click**.
+
+6. To analyst file **example.phy**:
+* Run command `./mpboot-avx -s example.phy`
+* Or:
+    1. Open **mpboot-click** by double click on it
+    2. Press **y** to start enter command
+    3. Type **-s** and press **Enter**
+    4. Press **e** to continue entering command
+    5. Type **example.phy** and press **Enter**
+    6. Press **y** to finish command
+
+
+  
+## MPBoot-MPI
+### Downloading source code
+You can clone the source code from GitHub with:
+
+`git clone https://github.com/diepthihoang/mpboot.git`  
+Switch to branch which contains MPBoot-MPI source code:
+* `git checkout mpboot-mpi-sync` for synchronous version
+* `git checkout mpboot-mpi-async` for asynchronous version
+
+### Compiling under Linux
+1. Create folder **build** outside folder **mpboot**.
+2. Open a Terminal.
+3. Change directory to **build**
+4. Configure source code with CMake:  
+`cmake ../source -DIQTREE_FLAGS=avx -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx`
+> Replace avx by sse4 in above command if you decide to run MPBoot on SSE architecture
+
+5. Run command `make -j4` to compile source code with 4 processes:  
+> Option **j** specifies the number of processes used to compile source code with **make**.
+  
+The compiler will generate an executable file named **mpboot-avx**
+> In case of running MPBoot on SSE architecture, the executable file is named **mpboot**.
+
+6. To analyst file **example.phy** with 2 processes, run command:  
+`mpirun -np 2 ./mpboot-avx -s example.phy`
+> Option **np** specifies the number of processes used to run MPBoot-MPI
+
+### Compiling under Mac OS X
+1. Create folder **build** outside folder **mpboot**.
+2. Open a Terminal.
+3. Change directory to **build**
+4. Configure source code with CMake:  
+`cmake ../mpboot -DIQTREE_FLAGS=avx -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx`
+> Replace avx by sse4 in above command if you decide to run MPBoot on SSE architecture
+
+5. Run command `make -j4` to compile source code with 4 processes. Option **j** specifies the number of processes used to compile source code with **make**.
+  
+The compiler will generate an executable file named **mpboot-avx**
+> In case of running MPBoot on SSE architecture, the executable file is named **mpboot**.
+
+6. To analyst file **example.phy** with 2 processes, run command:  
+`mpirun -np 2 ./mpboot-avx -s example.phy` 
+> Option **np** specifies the number of processes used to run MPBoot-MPI
+
+### Compiling under Windows
+* Requirements:  
+  * cmake version >= 3.21
+  * TDM-GCC
+  * MSMPI
+1. Create folder **build** outside folder **mpboot**.
+2. Open a Terminal.
+3. Change directory to **build**
+4. Configure source code with CMake:  
+`cmake -G "MinGW Makefiles" -DIQTREE_FLAGS=mpiavx ../mpboot`
+> Replace mpiavx by mpisse4 in above command if you decide to run MPBoot on SSE architecture.  
+> Due to having conflicts with **Vectorization**, please not using **Clang** to configure source code.
+
+5. Run command `mingw32-make -j4` to compile source code with 4 processes:  
+> Option **j** specifies the number of processes used to compile source code with **make**.
+  
+The compiler will generate an executable file named **mpboot-avx** 
+> In case of running MPBoot on SSE architecture, the executable file is named **mpboot**.
+  
+
+6. To analyst file **example.phy** with 2 processes, run command:  
+`mpiexec -n 2 ./mpboot-avx -s example.phy`
+> Option **n** specifies the number of processes used to run MPBoot-MPI
diff --git a/alignment.cpp b/alignment.cpp
index f046ce5..8b1d32b 100644
--- a/alignment.cpp
+++ b/alignment.cpp
@@ -605,7 +605,7 @@ void Alignment::extractDataBlock(NxsCharactersBlock *data_block) {
         }
 }
 
-bool Alignment::addPattern(Pattern &pat, int site, int freq) {
+bool Alignment::addPattern(Pattern &pat, int site, int freq, int ras_pars_score) {
     // check if pattern contains only gaps
     bool gaps_only = true;
     for (Pattern::iterator it = pat.begin(); it != pat.end(); it++)
@@ -621,6 +621,7 @@ bool Alignment::addPattern(Pattern &pat, int site, int freq) {
     PatternIntMap::iterator pat_it = pattern_index.find(pat);
     if (pat_it == pattern_index.end()) { // not found
         pat.frequency = freq;
+        pat.ras_pars_score = ras_pars_score;
         pat.computeConst(STATE_UNKNOWN);
         push_back(pat);
         pattern_index[pat] = size()-1;
@@ -628,6 +629,7 @@ bool Alignment::addPattern(Pattern &pat, int site, int freq) {
     } else {
         int index = pat_it->second;
         at(index).frequency += freq;
+        at(index).ras_pars_score = ras_pars_score;
         site_pattern[site] = index;
     }
     return gaps_only;
@@ -1565,7 +1567,7 @@ void Alignment::extractSubAlignment(Alignment *aln, IntVector &seq_id, int min_t
             pat.push_back(ch);
         }
         if (true_char < min_true_char) continue;
-        addPattern(pat, site, (*pit).frequency);
+        addPattern(pat, site, (*pit).frequency, (*pit).ras_pars_score);
         for (int i = 0; i < (*pit).frequency; i++)
             site_pattern[site++] = size()-1;
     }
diff --git a/alignment.h b/alignment.h
index 30f29a1..74f43ad 100644
--- a/alignment.h
+++ b/alignment.h
@@ -81,7 +81,7 @@ public:
             @return TRUE if pattern contains only gaps or unknown char. 
                             In that case, the pattern won't be added.
      */
-    bool addPattern(Pattern &pat, int site, int freq = 1);
+    bool addPattern(Pattern &pat, int site, int freq = 1, int ras_pars_score = 0);
 
 
     /**
diff --git a/phylotree.cpp b/phylotree.cpp
index 3eb4492..a86ba2b 100644
--- a/phylotree.cpp
+++ b/phylotree.cpp
@@ -547,6 +547,7 @@ void setBitsAll(UINT* &bit_vec, int num) {
  * A|C|G|T -> 15
  */
 UINT dna_state_map[128];
+UINT bin_state_map[2];
 UINT prot_state_map[128];
 /*
  * this will recompute for 2 DNA states as input and map to result of Fitch algorithm:
@@ -556,12 +557,17 @@ UINT prot_state_map[128];
  * End effect: an array of size 256, with 4 left bit of index for state 1 and 4 right bit for state 2
  */
 UINT dna_fitch_result[256];
+UINT bin_fitch_result[16];
 /*
  * either 0 or 1
  */
 UINT dna_fitch_step[256];
+UINT bin_fitch_step[16];
 
 void precomputeFitchInfo() {
+	bin_state_map[0] = 1; // '0'
+	bin_state_map[1] = 2; // '1'
+
 	dna_state_map[0] = 1; // A
 	dna_state_map[1] = 2; // C
 	dna_state_map[2] = 4; // G
@@ -579,6 +585,18 @@ void precomputeFitchInfo() {
     dna_state_map[1+2+4+3] = 1+2+4; // A or G or C
 
     int state;
+    for (state = 0; state < 16; state++) {
+    	UINT state1 = state & 3;
+    	UINT state2 = state >> 2;
+    	UINT intersection = state1 & state2;
+    	if (intersection == 0) {
+    		bin_fitch_result[state] = state1 | state2;
+    		bin_fitch_step[state] = 1;
+    	} else {
+    		bin_fitch_result[state] = intersection;
+    		bin_fitch_step[state] = 0;
+    	}
+    }
     for (state = 0; state < 256; state++) {
     	UINT state1 = state & 15;
     	UINT state2 = state >> 4;
@@ -705,6 +723,58 @@ void PhyloTree::computePartialParsimony(PhyloNeighbor *dad_branch, PhyloNode *da
     assert(dad_branch->partial_pars);
     dad_branch->partial_lh_computed |= 2;
 
+    if (nstates == 2 && (node->isLeaf() || node->degree() == 3)) {
+    	// ULTRAFAST VERSION FOR BINARY, assuming that UINT is 32-bit integer
+        if (node->isLeaf() && dad) {
+            // external node
+            for (ptn = 0; ptn < aln->size(); ptn += 16) {
+            	UINT states = 0;
+            	int maxi = aln->size() - ptn;
+            	if(maxi > 16) maxi = 16;
+            	for (int i = 0; i < maxi; ++i) {
+            		UINT bit_state = bin_state_map[(aln->at(ptn+i))[node->id]];
+            		states |= (bit_state << (i << 1));
+            		dad_branch->partial_pars[ptn_pars_start_id + ptn + i] = 0;
+            	}
+            	dad_branch->partial_pars[ptn/16] = states;
+            }
+            dad_branch->partial_pars[pars_size - 1] = 0; // set subtree score = 0
+        } else {
+            // internal node
+        	memset(dad_branch->partial_pars + ptn_pars_start_id, 0, nptn * sizeof(int));
+        	UINT *left = NULL, *right = NULL;
+        	int pars_steps = 0;
+            FOR_NEIGHBOR_IT(node, dad, it)if ((*it)->node->name != ROOT_NAME) {
+                computePartialParsimony((PhyloNeighbor*) (*it), (PhyloNode*) node);
+                if (!left)
+                	left = ((PhyloNeighbor*) (*it))->partial_pars;
+                else
+                	right = ((PhyloNeighbor*) (*it))->partial_pars;
+                pars_steps += ((PhyloNeighbor*) (*it))->partial_pars[pars_size-1];
+                for (int p = 0; p < nptn; ++p)
+                	dad_branch->partial_pars[ptn_pars_start_id + p] += ((PhyloNeighbor*) (*it))->partial_pars[ptn_pars_start_id + p];
+            }
+            for (ptn = 0; ptn < aln->size(); ptn += 16) {
+            	UINT states_left = left[ptn/16];
+            	UINT states_right = right[ptn/16];
+            	UINT states_dad = 0;
+            	int maxi = aln->size() - ptn;
+            	if(maxi > 16) maxi = 16;
+            	for (int i = 0; i < maxi; ++i) {
+            		UINT state_left = (states_left >> (i << 1)) & 3;
+            		UINT state_right = (states_right >> (i << 1)) & 3;
+            		UINT state_both = state_left | (state_right << 2);
+            		states_dad |= bin_fitch_result[state_both] << (i << 1);
+            		pars_steps += bin_fitch_step[state_both] * aln->at(ptn+i).frequency;
+            		dad_branch->partial_pars[ptn_pars_start_id + ptn + i] += bin_fitch_step[state_both];
+            	}
+            	dad_branch->partial_pars[ptn/16] = states_dad;
+            }
+            dad_branch->partial_pars[pars_size - 1] = pars_steps;
+        }
+        return;
+    } // END OF BINARY VERSION
+    
     if (nstates == 4 && aln->seq_type == SEQ_DNA && (node->isLeaf() || node->degree() == 3)) {
     	// ULTRAFAST VERSION FOR DNA, assuming that UINT is 32-bit integer
         if (node->isLeaf() && dad) {
@@ -969,7 +1039,25 @@ int PhyloTree::computeParsimonyBranch(PhyloNeighbor *dad_branch, PhyloNode *dad,
     int i, ptn;
     int tree_pars = 0;
 
-    if (aln->num_states == 4 && aln->seq_type == SEQ_DNA) {
+    if (aln->num_states == 2) {
+    	// ULTRAFAST VERSION FOR BINARY
+        for (ptn = 0; ptn < aln->size(); ptn += 16) {
+        	UINT states_left = node_branch->partial_pars[ptn/16];
+        	UINT states_right = dad_branch->partial_pars[ptn/16];
+        	UINT states_dad = 0;
+        	int maxi = aln->size() - ptn;
+        	if (maxi > 16) maxi = 16;
+			for (i = 0; i < maxi; ++i) {
+				UINT state_left = (states_left >> (i << 1)) & 3;
+				UINT state_right = (states_right >> (i << 1)) & 3;
+				UINT state_both = state_left | (state_right << 2);
+				states_dad |= bin_fitch_result[state_both] << (i << 1);
+				tree_pars += bin_fitch_step[state_both] * aln->at(ptn+i).frequency;
+				_pattern_pars[ptn + i] = node_branch->partial_pars[ptn_pars_start_id + ptn + i] +
+					dad_branch->partial_pars[ptn_pars_start_id + ptn + i] + bin_fitch_step[state_both];
+			}
+        }
+    } else if (aln->num_states == 4 && aln->seq_type == SEQ_DNA) {
     	// ULTRAFAST VERSION FOR DNA
         for (ptn = 0; ptn < aln->size(); ptn+=8) {
         	UINT states_left = node_branch->partial_pars[ptn/8];
