diff --git a/native/jni/src/suggest/core/layout/normal_distribution.h b/native/jni/src/suggest/core/layout/normal_distribution.h
new file mode 100644
index 0000000000000000000000000000000000000000..5f21a59c02cb07d1c0cc9d8969df113e2c4671ff
--- /dev/null
+++ b/native/jni/src/suggest/core/layout/normal_distribution.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2014 The Android Open Source Project
+ *
+ * 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.
+ */
+
+#ifndef LATINIME_NORMAL_DISTRIBUTION_H
+#define LATINIME_NORMAL_DISTRIBUTION_H
+
+#include <cmath>
+
+#include "defines.h"
+
+namespace latinime {
+
+// Normal distribution N(u, sigma^2).
+class NormalDistribution {
+ public:
+    NormalDistribution(const float u, const float sigma)
+            : mU(u),
+              mPreComputedNonExpPart(1.0f / sqrtf(2.0f * M_PI_F
+                      * GeometryUtils::SQUARE_FLOAT(sigma))),
+              mPreComputedExponentPart(-1.0f / (2.0f * GeometryUtils::SQUARE_FLOAT(sigma))) {}
+
+    float getProbabilityDensity(const float x) const {
+        const float shiftedX = x - mU;
+        return mPreComputedNonExpPart
+                * expf(mPreComputedExponentPart * GeometryUtils::SQUARE_FLOAT(shiftedX));
+    }
+
+ private:
+    DISALLOW_IMPLICIT_CONSTRUCTORS(NormalDistribution);
+
+    const float mU; // mean value
+    const float mPreComputedNonExpPart; // = 1 / sqrt(2 * PI * sigma^2)
+    const float mPreComputedExponentPart; // = -1 / (2 * sigma^2)
+};
+} // namespace latinime
+#endif // LATINIME_NORMAL_DISTRIBUTION_H
diff --git a/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp b/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp
index 867f598439378728193e80bb5b3ffe94d6effbd9..5a3ff7384b3aff2ee356dadd76a9e9cc4e760a03 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp
+++ b/native/jni/src/suggest/core/layout/proximity_info_state_utils.cpp
@@ -24,6 +24,7 @@
 
 #include "defines.h"
 #include "suggest/core/layout/geometry_utils.h"
+#include "suggest/core/layout/normal_distribution.h"
 #include "suggest/core/layout/proximity_info.h"
 #include "suggest/core/layout/proximity_info_params.h"
 
@@ -717,8 +718,8 @@ namespace latinime {
         const float sigma = speedxAngleRate + speedxNearestKeyDistanceRate
                 + ProximityInfoParams::MIN_STANDARD_DEVIATION;
 
-        ProximityInfoUtils::NormalDistribution
-                distribution(ProximityInfoParams::CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION, sigma);
+        NormalDistribution distribution(
+                ProximityInfoParams::CENTER_VALUE_OF_NORMALIZED_DISTRIBUTION, sigma);
         // Summing up probability densities of all near keys.
         float sumOfProbabilityDensities = 0.0f;
         for (int j = 0; j < keyCount; ++j) {
diff --git a/native/jni/src/suggest/core/layout/proximity_info_utils.h b/native/jni/src/suggest/core/layout/proximity_info_utils.h
index 310bbdb62f5b8edc5f843c50f9ecb2c12ed403ea..c273ef456f1fa31e290575006c0d50a7fb53902b 100644
--- a/native/jni/src/suggest/core/layout/proximity_info_utils.h
+++ b/native/jni/src/suggest/core/layout/proximity_info_utils.h
@@ -125,28 +125,6 @@ class ProximityInfoUtils {
          return type == MATCH_CHAR || type == PROXIMITY_CHAR || type == ADDITIONAL_PROXIMITY_CHAR;
      }
 
-    // Normal distribution N(u, sigma^2).
-    struct NormalDistribution {
-     public:
-        NormalDistribution(const float u, const float sigma)
-                : mU(u),
-                  mPreComputedNonExpPart(1.0f / sqrtf(2.0f * M_PI_F
-                          * GeometryUtils::SQUARE_FLOAT(sigma))),
-                  mPreComputedExponentPart(-1.0f / (2.0f * GeometryUtils::SQUARE_FLOAT(sigma))) {}
-
-        float getProbabilityDensity(const float x) const {
-            const float shiftedX = x - mU;
-            return mPreComputedNonExpPart
-                    * expf(mPreComputedExponentPart * GeometryUtils::SQUARE_FLOAT(shiftedX));
-        }
-
-     private:
-        DISALLOW_IMPLICIT_CONSTRUCTORS(NormalDistribution);
-        const float mU; // mean value
-        const float mPreComputedNonExpPart; // = 1 / sqrt(2 * PI * sigma^2)
-        const float mPreComputedExponentPart; // = -1 / (2 * sigma^2)
-    }; // struct NormalDistribution
-
  private:
     DISALLOW_IMPLICIT_CONSTRUCTORS(ProximityInfoUtils);