diff --git a/INSTALL.txt b/INSTALL.txt
deleted file mode 100644
index 4e0818df3c7f29f3a071f0ae8ba0217a80abfb20..0000000000000000000000000000000000000000
--- a/INSTALL.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-INSTALLATION
-
-The python orekit wrapper requires:
-- a python installation (version 2.3-2.7)
-- The JCC tool version 2.19 or later http://lucene.apache.org/pylucene/jcc/
-- a java JDK
-
-The easiest way to install the orekit wrapper is to use pre-build packages. A recipe for a conda package for orekit is included in the repository.
-
-To build the wrapper from scratch:
-
-Place the java wrapper source file in the orekit source tree. Compile an
-orekit jar file including the wrapper.
-
-Place this jar file together with apache-commons-math jar file in the same
-directory as the provided build file, and execute the build. Note that
-the end command of the build may need to be change according to your needs,
-"install","bdist_winist" etc.
-
-Hints:
-One common failure is that the JCC package cannot reach the java virtual machine.
-The location varies on different platforms and on different java versions.
-
-Mint Linux
-----------
-for open-jdk it seems that the libjvm.so is not added to the library path by itself.
-Add the path to libjvm.so to a file in /etc/ld.conf.d/ such as java.conf
-such as:
-
-	/usr/lib/jvm/java-7-openjdk-amd64/jre/lib/amd64/server
-
-then run sudo ldconfig
-check if it is there by: ldconfig -p | grep jvm
-
-you might need to set the enviroment variable JCC_JDK. Example:
-
-	export JCC_JDK=/usr/lib/jvm/java-7-openjdk-amd64
-
-Windows
--------
-Needs to set the variable JCC_JDK and include java items in the PATH. Example:
-
-	set JCC_JDK=C:\Program Files (x86)\Java\jdk1.6.0_35
-	set PATH=%JCC_JDK%\jre\bin\client;%JCC_JDK%\bin;%JCC_JDK%\lib;%PATH%
-
-These can be etiher set in a bat file or directly in the computer environment variable dialog in windows.
diff --git a/orekit-conda-recipe/README-conda-recipe.txt b/orekit-conda-recipe/README-conda-recipe.txt
new file mode 100644
index 0000000000000000000000000000000000000000..644a2655af69b29a7bf3f0f77c8b6677e9edf9ad
--- /dev/null
+++ b/orekit-conda-recipe/README-conda-recipe.txt
@@ -0,0 +1,2 @@
+A good source of information on how to  build the wrapper is in the automated build scripts
+available at https://github.com/conda-forge/orekit-feedstock/tree/main/recipe
\ No newline at end of file
diff --git a/orekit-conda-recipe/bld.bat b/orekit-conda-recipe/bld.bat
deleted file mode 100644
index b8768ef24c160c7bb332108605ce1f78b68e683c..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/bld.bat
+++ /dev/null
@@ -1,89 +0,0 @@
-:: adding compile parameters explicitly as relocation for conda does not seem to detect JCC  path under windows
-@set "JCC_JDK=%PREFIX%\Library"
-@set "JCC_INCLUDES=%PREFIX%\Library\include\win32;%PREFIX%\Library\include"
-@set "JCC_CFLAGS=/EHsc;/D_CRT_SECURE_NO_WARNINGS"
-@set "JCC_LFLAGS=/DLL;/LIBPATH:%PREFIX%\Library\lib;Ws2_32.lib;jvm.lib"
-@set "JCC_DEBUG_CFLAGS=/Od;/DDEBUG"
-@set "JCC_JAVAC=%PREFIX%\Library\bin\javac.exe"
-@set "JCC_JAVADOC=%PREFIX%\Library\bin\javadoc.exe"
-
-"%PYTHON%" -m jcc  ^
---use_full_names ^
---python orekit ^
---version %PKG_VERSION% ^
---jar %SRC_DIR%\orekit-10.3.1.jar ^
---jar %SRC_DIR%\hipparchus-clustering-1.8.jar ^
---jar %SRC_DIR%\hipparchus-core-1.8.jar ^
---jar %SRC_DIR%\hipparchus-fft-1.8.jar ^
---jar %SRC_DIR%\hipparchus-filtering-1.8.jar ^
---jar %SRC_DIR%\hipparchus-fitting-1.8.jar ^
---jar %SRC_DIR%\hipparchus-geometry-1.8.jar ^
---jar %SRC_DIR%\hipparchus-migration-1.8.jar ^
---jar %SRC_DIR%\hipparchus-ode-1.8.jar ^
---jar %SRC_DIR%\hipparchus-optim-1.8.jar ^
---jar %SRC_DIR%\hipparchus-stat-1.8.jar ^
---jar %SRC_DIR%\rugged-2.2.jar ^
---package java.io ^
---package java.util ^
---package java.text ^
---package org.orekit ^
---package org.orekit.rugged ^
-java.io.BufferedReader ^
-java.io.FileInputStream ^
-java.io.FileOutputStream ^
-java.io.InputStream ^
-java.io.InputStreamReader ^
-java.io.ObjectInputStream ^
-java.io.ObjectOutputStream ^
-java.io.PrintStream ^
-java.io.StringReader ^
-java.io.StringWriter ^
-java.lang.System ^
-java.text.DecimalFormat ^
-java.text.DecimalFormatSymbols ^
-java.util.ArrayDeque  ^
-java.util.ArrayList  ^
-java.util.Arrays  ^
-java.util.Collection  ^
-java.util.Collections ^
-java.util.Date ^
-java.util.HashMap ^
-java.util.HashSet ^
-java.util.List  ^
-java.util.Locale ^
-java.util.Map ^
-java.util.Set ^
-java.util.TreeSet ^
-java.util.stream.Collectors ^
-java.util.stream.Stream ^
-java.util.stream.DoubleStream ^
-java.util.function.LongConsumer ^
-java.util.function.IntConsumer ^
-java.util.function.DoubleConsumer ^
---module %SRC_DIR%\pyhelpers.py ^
---reserved INFINITE ^
---reserved ERROR ^
---reserved NAN ^
---reserved OVERFLOW ^
---reserved NO_DATA ^
---reserved min ^
---reserved max ^
---reserved mean ^
---reserved SNAN ^
---classpath %PREFIX%\Library\lib\tools.jar ^
---files 81 ^
---build ^
---install
-if errorlevel 1 exit 1
-
-:: ensure that JCC_JDK is set correctly by invoking an activate script
-set ACTIVATE_DIR=%PREFIX%\etc\conda\activate.d
-set DEACTIVATE_DIR=%PREFIX%\etc\conda\deactivate.d
-mkdir %ACTIVATE_DIR%
-mkdir %DEACTIVATE_DIR%
-
-copy %RECIPE_DIR%\scripts\activate.bat %ACTIVATE_DIR%\orekit-activate.bat
-if errorlevel 1 exit 1
-
-copy %RECIPE_DIR%\scripts\deactivate.bat %DEACTIVATE_DIR%\orekit-deactivate.bat
-if errorlevel 1 exit 1
diff --git a/orekit-conda-recipe/build.sh b/orekit-conda-recipe/build.sh
deleted file mode 100644
index d8edab0e55081bdeeddade22a85019c8450ba2cd..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/build.sh
+++ /dev/null
@@ -1,105 +0,0 @@
-#!/bin/bash
-
-if [ "$(uname)" == "Darwin" ]
-then
-  export JCC_JDK=${PREFIX}
-  export JCC_ARGSEP=";"
-  export JCC_INCLUDES="${PREFIX}/include;${PREFIX}/include/darwin"
-  export JCC_LFLAGS="-v;-L${PREFIX}/jre/lib;-ljava;-L${PREFIX}/jre/lib/server;-ljvm;-Wl,-rpath;-Wl,${PREFIX}/jre/lib;-Wl,-rpath;-Wl,${PREFIX}/jre/lib/server;-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET"
-	export JCC_CFLAGS="-fno-strict-aliasing;-Wno-write-strings;-Qunused-arguments;-mmacosx-version-min=10.9;-std=c++11;-stdlib=libc++"
-  export JCC_DEBUG_CFLAGS="-O0;-g;-DDEBUG"
-  export JCC_JAVAC="javac;-source;1.8;-target;1.8"
-  export JCC_JAVADOC="javadoc"
-
-else
-  # GNU/Linux recipe
-  export JCC_JDK=${PREFIX}
-  export JCC_ARGSEP=";"
-	export JCC_LFLAGS="-v;-Wl,-v;-L${PREFIX}/jre/lib/amd64;-ljava;-L${PREFIX}/jre/lib/amd64/server;-ljvm;-lverify;-Wl,-rpath=${PREFIX}/jre/lib/amd64:${PREFIX}/jre/lib/amd64/server"
-  export JCC_INCLUDES="${PREFIX}/include;${PREFIX}/include/linux"
-	export JCC_JAVAC=${PREFIX}/bin/javac
-	export JCC_CFLAGS="-v;-fno-strict-aliasing;-Wno-write-strings;-D__STDC_FORMAT_MACROS"
-  export JCC_DEBUG_CFLAGS="-O0;-g;-DDEBUG"
-  export JCC_JAVADOC="javadoc"
-fi
-
-printenv
-
-
-$PYTHON -m jcc \
---use_full_names \
---python orekit \
---version ${PKG_VERSION} \
---jar $SRC_DIR/orekit-10.3.1.jar \
---jar $SRC_DIR/hipparchus-clustering-1.8.jar \
---jar $SRC_DIR/hipparchus-core-1.8.jar \
---jar $SRC_DIR/hipparchus-fft-1.8.jar \
---jar $SRC_DIR/hipparchus-filtering-1.8.jar \
---jar $SRC_DIR/hipparchus-fitting-1.8.jar \
---jar $SRC_DIR/hipparchus-geometry-1.8.jar \
---jar $SRC_DIR/hipparchus-migration-1.8.jar \
---jar $SRC_DIR/hipparchus-ode-1.8.jar \
---jar $SRC_DIR/hipparchus-optim-1.8.jar \
---jar $SRC_DIR/hipparchus-stat-1.8.jar \
---jar $SRC_DIR/rugged-2.2.jar \
---package java.io \
---package java.util \
---package java.text \
---package org.orekit \
---package org.orekit.rugged \
-java.io.BufferedReader \
-java.io.FileInputStream \
-java.io.FileOutputStream \
-java.io.InputStream \
-java.io.InputStreamReader \
-java.io.ObjectInputStream \
-java.io.ObjectOutputStream \
-java.io.PrintStream \
-java.io.StringReader \
-java.io.StringWriter \
-java.lang.System \
-java.text.DecimalFormat \
-java.text.DecimalFormatSymbols \
-java.util.ArrayDeque  \
-java.util.ArrayList \
-java.util.Arrays \
-java.util.Collection \
-java.util.Collections \
-java.util.Date \
-java.util.HashMap \
-java.util.HashSet \
-java.util.List \
-java.util.Locale \
-java.util.Map \
-java.util.Set \
-java.util.TreeSet \
-java.util.stream.Collectors \
-java.util.stream.Stream \
-java.util.stream.DoubleStream \
-java.util.function.LongConsumer \
-java.util.function.IntConsumer \
-java.util.function.DoubleConsumer \
---module $SRC_DIR/pyhelpers.py \
---reserved INFINITE \
---reserved ERROR \
---reserved OVERFLOW \
---reserved NO_DATA \
---reserved NAN \
---reserved min \
---reserved max \
---reserved mean \
---reserved SNAN \
---classpath $PREFIX/lib/tools.jar \
---files 81 \
---build \
---install
-
-# ensure that JCC_JDK is set correctly by invoking an activate script
-
-ACTIVATE_DIR=$PREFIX/etc/conda/activate.d
-DEACTIVATE_DIR=$PREFIX/etc/conda/deactivate.d
-mkdir -p $ACTIVATE_DIR
-mkdir -p $DEACTIVATE_DIR
-
-cp $RECIPE_DIR/scripts/activate.sh $ACTIVATE_DIR/orekit-activate.sh
-cp $RECIPE_DIR/scripts/deactivate.sh $DEACTIVATE_DIR/orekit-deactivate.sh
diff --git a/orekit-conda-recipe/meta.yaml b/orekit-conda-recipe/meta.yaml
deleted file mode 100644
index 01cfae74eb3270af732bd9a3656133008e08820f..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/meta.yaml
+++ /dev/null
@@ -1,74 +0,0 @@
-{% set name = "orekit" %}
-{% set version = "10.3.1" %}
-{% set artifact_filename = "v10_3_1_0" %}
-{% set sha256 = "9044ea7bc02e2ead2f2470dff4902f3a5f158adc7d389231313758bd8ee11f05" %}  # [not osx]  zip file
-{% set sha256 = "bb1c7870f5177340f1417004f4f9224d7b6fd3f6f992f06764c518606ce2b310" %}  # [osx]  tar.gz file
-
-
-package:
-  name: {{ name|lower }}
-  version: {{ version }}
-
-source:
-  fn: {{ artifact_filename }}.zip  # [not osx]
-  url: https://github.com/petrushy/orekit_python_artifacts/archive/{{ artifact_filename }}.zip  # [not osx]
-
-  fn: {{ artifact_filename }}.tar.gz  # [osx]
-  url: https://github.com/petrushy/orekit_python_artifacts/archive/{{ artifact_filename }}.tar.gz  # [osx]
-  sha256: {{ sha256 }}
-
-build:
-  number: 1
-
-  rpaths:
-    - lib/
-    - jre/lib/amd64/
-    - jre/lib/amd64/server/
-
-requirements:
-  build:
-    - {{ compiler('c') }}
-    - {{ compiler('cxx') }}
-    - openjdk 8
-
-  host:
-    - python
-    - setuptools
-    - jcc
-    - openjdk 8
-
-  run:
-    - python
-    - openjdk 8
-
-test:
-  imports:
-    - orekit
-
-  source_files:
-    - test/*.py
-    - test/orekit-data.zip
-    - test/resources.zip
-    - test/resources/ccsds/*.txt
-
-about:
-  home: https://www.orekit.org/forge/projects/orekit-python-wrapper
-  license: Apache-2.0
-  license_family: Apache
-  license_file: LICENSE.txt
-  summary: 'An accurate and efficient core layer for space flight dynamics applications '
-
-  description:
-    Orekit aims at providing accurate and efficient low level components for
-    the development of flight dynamics applications. It is designed to be
-    easily used in very different contexts, from quick studies up to critical operations.
-    As a library, Orekit provides basic elements (orbits, dates, attitude, frames, ...) and
-    various algorithms to handle them (conversions, propagations, pointing, ....).
-
-    The Orekit library is written in java. This package provides a python wrapper to that library.
-
-  doc_url: https://www.orekit.org/static/apidocs/
-
-extra:
-  recipe-maintainers:
-    - petrushy
diff --git a/orekit-conda-recipe/run_test.bat b/orekit-conda-recipe/run_test.bat
deleted file mode 100644
index e764bf218d0b275f71023e517f374fd0e3b92f86..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/run_test.bat
+++ /dev/null
@@ -1,13 +0,0 @@
-cd test
-setlocal EnableDelayedExpansion
-set error=0
-
-for %%f in (*.py) do (
-    python "%%f"
-    if "!errorlevel!" NEQ "0" (
-        set error=1
-    )
-)
-
-if %error% NEQ 0 exit /B 1
-
diff --git a/orekit-conda-recipe/run_test.sh b/orekit-conda-recipe/run_test.sh
deleted file mode 100644
index d69b809a71cbd26733040abf174859c1342654ed..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/run_test.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/usr/bin/env bash
-cd test
-
-ERROR=0
-
-for f in *.py; do
-    if python "$f"; then
-        echo "Test reported ok"
-    else
-        echo "Test failed"
-        ERROR=1
-    fi
-done
-exit $ERROR
diff --git a/orekit-conda-recipe/scripts/activate.bat b/orekit-conda-recipe/scripts/activate.bat
deleted file mode 100644
index 7649cae0f3404431e83278d88ec4a1317edc8116..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/scripts/activate.bat
+++ /dev/null
@@ -1,10 +0,0 @@
-:: Store existing env vars and set to this conda env
-:: so other installs don't pollute the environment.
-
-@if defined JCC_JDK (
-    @set "_JCC_JDK_CONDA_BACKUP=%JCC_JDK%"
-)
-@set "JCC_JDK=%CONDA_PREFIX%\Library"
-
-@set "_JCC_PATH_CONDA_BACKUP=%PATH%"
-@set "PATH=%JCC_JDK%\jre\bin\server;%JCC_JDK%;%JCC_JDK%\jre\bin;%PATH%"
diff --git a/orekit-conda-recipe/scripts/activate.sh b/orekit-conda-recipe/scripts/activate.sh
deleted file mode 100644
index f568969e3abb8621adde453d8e8ed513cfc065f6..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/scripts/activate.sh
+++ /dev/null
@@ -1,2 +0,0 @@
-export _JCC_JDK_CONDA_BACKUP=${JCC_JDK:-}
-export JCC_JDK=$CONDA_PREFIX
diff --git a/orekit-conda-recipe/scripts/deactivate.bat b/orekit-conda-recipe/scripts/deactivate.bat
deleted file mode 100644
index 5fdca4c78dfa59ee4ea42b3e1a550eff2cc61ce2..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/scripts/deactivate.bat
+++ /dev/null
@@ -1,12 +0,0 @@
-:: Restore previous JCC_JDK and PATH env vars if they were set.
-
-@set "JCC_JDK="
-@if defined _JCC_JDK_CONDA_BACKUP (
-  @set "JCC_JDK=%_JCC_JDK_CONDA_BACKUP%"
-  @set "_JCC_JDK_CONDA_BACKUP="
-)
-
-@if defined _JCC_PATH_CONDA_BACKUP (
-    @set "PATH =%_JCC_PATH_CONDA_BACKUP%"
-    @set "_JCC_PATH_CONDA_BACKUP="
-)
diff --git a/orekit-conda-recipe/scripts/deactivate.sh b/orekit-conda-recipe/scripts/deactivate.sh
deleted file mode 100644
index 98c73063d4fb80f6ffb66337e43a96536b1e08b7..0000000000000000000000000000000000000000
--- a/orekit-conda-recipe/scripts/deactivate.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-
-# Restore previous env vars if they were set.
-unset JCC_JDK
-if [[ -n "$_JCC_JDK_CONDA_BACKUP" ]]; then
-    export JCC_JDK=$_JCC_JDK_CONDA_BACKUP
-    unset _JCC_JDK_CONDA_BACKUP
-fi
diff --git a/python_files/pyhelpers.py b/python_files/pyhelpers.py
index 334d38cabfdd46c2092d739a9a01282a9b3f27e0..ba4bc1850ea3846d81a71a5452a77450cc307a24 100644
--- a/python_files/pyhelpers.py
+++ b/python_files/pyhelpers.py
@@ -104,7 +104,7 @@ def setup_orekit_curdir(filename='orekit-data.zip'):
         print('filename ', filename, ' is neither a file nor a folder')
     DM.clearProviders()
     DM.clearLoadedDataNames()
-    DM.clearFilters()
+    DM.resetFiltersToDefault()
     DM.addProvider(crawler)
 
 
diff --git a/python_files/test/AbstractDetectorTest.py b/python_files/test/AbstractDetectorTest.py
index 64c60f15414bf1692c1b19d1c0c83aefb2097b9d..2ba32011d2064e540545d487aa45be7b3fda0dfb 100644
--- a/python_files/test/AbstractDetectorTest.py
+++ b/python_files/test/AbstractDetectorTest.py
@@ -1,6 +1,8 @@
 # -*- coding: utf-8 -*-
 
 import orekit
+from org.orekit.propagation import SpacecraftState
+
 orekit.initVM()
 
 from org.orekit.frames import FramesFactory, TopocentricFrame
@@ -10,7 +12,7 @@ from org.orekit.orbits import KeplerianOrbit
 from org.orekit.utils import Constants
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.utils import PVCoordinates, IERSConventions
-from org.orekit.propagation.events.handlers import PythonEventHandler
+from org.orekit.propagation.events.handlers import PythonEventHandler, EventHandler
 from org.hipparchus.geometry.euclidean.threed import Vector3D
 from org.orekit.propagation.events import PythonAbstractDetector
 from org.orekit.propagation.events.handlers import StopOnEvent
@@ -44,15 +46,15 @@ class PassCounter(PythonEventHandler):
 
 class MyElevationDetector(PythonAbstractDetector):
 
-    def __init__(self, elevation, topo, handler=None):
+    def __init__(self, elevation: float, topo: TopocentricFrame, handler: EventHandler = None):
         self.elevation = elevation
-        self.topo = topo
+        self.topo: TopocentricFrame = topo
 
         dmax = float(PythonAbstractDetector.DEFAULT_MAXCHECK)
         dthresh = float(PythonAbstractDetector.DEFAULT_THRESHOLD)
         dmaxiter = PythonAbstractDetector.DEFAULT_MAX_ITER
         if handler is None:
-            handler = StopOnEvent().of_(MyElevationDetector)
+            handler = StopOnEvent()
 
         super(MyElevationDetector, self).__init__(dmax, dthresh, dmaxiter, handler) #super(maxCheck, threshold, maxIter, handler);
 
@@ -62,10 +64,10 @@ class MyElevationDetector(PythonAbstractDetector):
     def getElevation(self):
         return self.elevation
 
-    def getTopocentricFrame(self):
+    def getTopocentricFrame(self) -> TopocentricFrame:
         return self.topo
 
-    def g(self, s):
+    def g(self, s: SpacecraftState) -> float:
         tmp = self.topo.getElevation(s.getPVCoordinates().getPosition(), s.getFrame(), s.getDate())-self.elevation
         return tmp
 
@@ -104,7 +106,7 @@ class AbstractDetectorTest(unittest.TestCase):
 
         detector = MyElevationDetector(elevation, sta1Frame)
 
-        mycounter = PassCounter().of_(MyElevationDetector)
+        mycounter = PassCounter()
         detector = detector.withHandler(mycounter)
 
         kepler.addEventDetector(detector)
diff --git a/python_files/test/AdditionalEquationsTest.py b/python_files/test/AdditionalEquationsTest.py
deleted file mode 100644
index 6056afef80713e35ed7c01682cf79cfefeb808cd..0000000000000000000000000000000000000000
--- a/python_files/test/AdditionalEquationsTest.py
+++ /dev/null
@@ -1,160 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-"""
-/* Copyright 2002-2018 CS Systèmes d'Information
- * Licensed to CS Systèmes d'Information (CS) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * CS licenses this file to You 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.
- */
-
- Python version translated from Java by Petrus Hyvönen, SSC 2018
-
-"""
-
-import unittest
-import sys
-
-# Python orekit specifics
-import orekit
-orekit.initVM()
-
-from orekit import JArray_double
-from org.orekit.data import DataProvidersManager, ZipJarCrawler, DataContext, DirectoryCrawler
-from org.orekit.propagation.integration import PythonAdditionalEquations
-from org.orekit.propagation.integration import AdditionalEquations
-from org.orekit.forces.gravity.potential import GravityFieldFactory
-from org.orekit.forces.gravity.potential import SHMFormatReader
-from java.io import File
-from java.lang import System
-
-
-from org.hipparchus.geometry.euclidean.threed import Vector3D
-from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
-
-from org.orekit.frames import FramesFactory
-from org.orekit.orbits import EquinoctialOrbit
-from org.orekit.orbits import OrbitType
-from org.orekit.propagation import SpacecraftState
-from org.orekit.propagation.numerical import NumericalPropagator
-from org.orekit.propagation.semianalytical.dsst import DSSTPropagator
-from org.orekit.time import AbsoluteDate
-from org.orekit.utils import PVCoordinates
-
-
-# The class to be the additional equation
-class InitCheckerEquations(PythonAdditionalEquations):  # implements AdditionalEquations
-
-    # This is the method called for object creation as in java InitCheckerEquations(self, expected)
-    def __init__(self, expected):
-        super(InitCheckerEquations, self).__init__()
-        self.expected = expected
-        self.called = False
-
-    # Part of AdditionalEquations interface
-    def init(self, initialState, target):
-        assert (self.expected - 1.0e-15) < initialState.getAdditionalState(self.getName())[0] < (self.expected + 1.0e-15)
-        self.called = True
-
-    # Part of AdditionalEquations interface
-    def computeDerivatives(self, s, pDot):
-        pDot[0] = 1.5
-        return JArray_double(6)
-
-    # Part of AdditionalEquations interface
-    def getName(self):
-        return "linear"
-
-    def wasCalled(self):
-        return self.called
-
-
-class AdditionalEquationsTest(unittest.TestCase):
-
-    def setUp(self):
-        DM = DataContext.getDefault().getDataProvidersManager()
-        datafile = File('resources')
-        if not datafile.exists():
-            print('File :', datafile.absolutePath, ' not found')
-
-        crawler = DirectoryCrawler(datafile)
-        DM.clearProviders()
-        DM.addProvider(crawler)
-        System.setProperty(DataProvidersManager.OREKIT_DATA_PATH, 'potential/shm-format')
-        GravityFieldFactory.addPotentialCoefficientsReader(SHMFormatReader("^eigen_cg03c_coef$", False))
-
-        mu = GravityFieldFactory.getUnnormalizedProvider(0, 0).getMu()
-        position = Vector3D(7.0e6, 1.0e6, 4.0e6)
-        velocity = Vector3D(-500.0, 8000.0, 1000.0)
-        self.initDate = AbsoluteDate.J2000_EPOCH
-        orbit = EquinoctialOrbit(PVCoordinates(position, velocity),
-                                 FramesFactory.getEME2000(), self.initDate, mu)
-        self.initialState = SpacecraftState(orbit)
-        self.tolerance = NumericalPropagator.tolerances(0.001, orbit, OrbitType.EQUINOCTIAL)
-
-        print('Setup Finished ok')
-
-    def tearDown(self):
-        self.initDate = None
-        self.initialState = None
-        self.tolerance = None
-
-    # Test for issue #401 with numerical propagator
-    def testInitNumerical(self):
-        # setup
-        reference = 1.25
-        checker = InitCheckerEquations(reference)
-        self.assertFalse(checker.wasCalled())
-
-        # action
-        integrator = DormandPrince853Integrator(0.001, 200.0, JArray_double.cast_(self.tolerance[0]),
-                                                JArray_double.cast_(self.tolerance[1]))
-        integrator.setInitialStepSize(60.0)
-        propagatorNumerical = NumericalPropagator(integrator)
-        propagatorNumerical.setInitialState(self.initialState.addAdditionalState(checker.getName(), reference))
-        propagatorNumerical.addAdditionalEquations(checker)
-        propagatorNumerical.propagate(self.initDate.shiftedBy(600.0))
-
-        # verify
-        self.assertTrue(checker.wasCalled())
-
-        print('testInitNumerical finished ok')
-
-    # Test for issue #401 with a DSST propagator
-    def testInitDSST(self):
-
-        # setup
-        reference = 3.5
-        checker = InitCheckerEquations(reference)
-        self.assertFalse(checker.wasCalled())
-
-        # action
-        integrator = DormandPrince853Integrator(0.001, 200.0, JArray_double.cast_(self.tolerance[0]),
-                                                JArray_double.cast_(self.tolerance[1]))
-        integrator.setInitialStepSize(60.0)
-
-        propagatorDSST = DSSTPropagator(integrator)
-        propagatorDSST.setInitialState(self.initialState.addAdditionalState(checker.getName(), reference))
-        propagatorDSST.addAdditionalEquations(checker)
-        propagatorDSST.propagate(self.initDate.shiftedBy(600.0))
-
-        # verify
-        self.assertTrue(checker.wasCalled())
-        print('testInitDSST was successfully finished')
-
-
-if __name__ == '__main__':
-    suite = unittest.TestLoader().loadTestsFromTestCase(AdditionalEquationsTest)
-    ret = not unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful()
-    sys.exit(ret)
diff --git a/python_files/test/AltitudeDetectorTest.py b/python_files/test/AltitudeDetectorTest.py
index 623bcf55818602be254f668888d5133e52f72c34..779b51c5b72da012f3230234979f9df90de8c566 100644
--- a/python_files/test/AltitudeDetectorTest.py
+++ b/python_files/test/AltitudeDetectorTest.py
@@ -37,7 +37,7 @@ from org.orekit.bodies import CelestialBodyFactory
 from org.orekit.bodies import OneAxisEllipsoid
 from org.orekit.frames import FramesFactory
 from org.orekit.orbits import KeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation import SpacecraftState
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.propagation.events.handlers import StopOnEvent
@@ -59,12 +59,13 @@ class AltitudeDetectorTest(unittest.TestCase):
         alt = apogee - earthRadius - 500
 
         #// initial state is at apogee
-        initialOrbit = KeplerianOrbit(a,e,0.0,0.0,0.0,FastMath.PI,PositionAngle.MEAN,EME2000,
+        initialOrbit = KeplerianOrbit(a,e,0.0,0.0,0.0,FastMath.PI,PositionAngleType.MEAN,EME2000,
                                                               initialDate,CelestialBodyFactory.getEarth().getGM())
         initialState = SpacecraftState(initialOrbit)
         kepPropagator = KeplerianPropagator(initialOrbit)
-        altDetector = AltitudeDetector(alt,
-            OneAxisEllipsoid(earthRadius, earthF, EME2000)).withHandler(StopOnEvent().of_(AltitudeDetector))
+        earth = OneAxisEllipsoid(earthRadius, earthF, EME2000)
+
+        altDetector = AltitudeDetector(alt, earth).withHandler(StopOnEvent())
 
         # altitudeDetector should stop propagation upon reaching required altitude
         kepPropagator.addEventDetector(altDetector)
diff --git a/python_files/test/BackAndForthDetectorTest.py b/python_files/test/BackAndForthDetectorTest.py
index 7cfb3dfb095fe4105e954ea991db4492704b35af..b39ac68b8759191291597e1c29a0c8d67d0ce54c 100644
--- a/python_files/test/BackAndForthDetectorTest.py
+++ b/python_files/test/BackAndForthDetectorTest.py
@@ -33,7 +33,7 @@ from org.orekit.bodies import OneAxisEllipsoid
 from org.orekit.frames import TopocentricFrame
 from org.orekit.orbits import KeplerianOrbit
 from org.orekit.frames import FramesFactory
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.propagation.events.handlers import EventHandler, PythonEventHandler
 from org.orekit.time import AbsoluteDate
@@ -83,7 +83,7 @@ class BackAndForthDetectorTest(unittest.TestCase):
         raan = math.radians(12.5)
         lM = math.radians(60.)
         iniOrb = KeplerianOrbit(a, e, i, w, raan, lM,
-                                          PositionAngle.MEAN, 
+                                          PositionAngleType.MEAN,
                                           FramesFactory.getEME2000(), date0,
                                           Constants.WGS84_EARTH_MU)
 
diff --git a/python_files/test/BrouwerLyddanePropagatorTest.py b/python_files/test/BrouwerLyddanePropagatorTest.py
index 7d455fb8a4d16211c3ee14067aa6706578dacc5a..3911df2d59d14166bcfc19e9f413a3d9bfa3cb41 100644
--- a/python_files/test/BrouwerLyddanePropagatorTest.py
+++ b/python_files/test/BrouwerLyddanePropagatorTest.py
@@ -17,7 +17,7 @@ from org.orekit.bodies import OneAxisEllipsoid
 from org.orekit.frames import TopocentricFrame
 from org.orekit.orbits import KeplerianOrbit
 from org.orekit.frames import FramesFactory
-from org.orekit.orbits import PositionAngle, EquinoctialOrbit, OrbitType
+from org.orekit.orbits import PositionAngleType, EquinoctialOrbit, OrbitType
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.propagation import SpacecraftState
 from org.orekit.propagation.numerical import NumericalPropagator
@@ -66,12 +66,12 @@ class BrouwerLyddanePropagatorTest(unittest.TestCase):
         finalOrbit = extrapolator.propagate(initDate)
 
         # positions  velocity and semi major axis match perfectly
-        self.assertAlmostEquals(0.0, Vector3D.distance(initialOrbit.getPVCoordinates().getPosition(),
+        self.assertAlmostEqual(0.0, Vector3D.distance(initialOrbit.getPVCoordinates().getPosition(),
                                                        finalOrbit.getPVCoordinates().getPosition()), delta=1.0e-8)
 
-        self.assertAlmostEquals(0.0, Vector3D.distance(initialOrbit.getPVCoordinates().getVelocity(),
+        self.assertAlmostEqual(0.0, Vector3D.distance(initialOrbit.getPVCoordinates().getVelocity(),
                                                        finalOrbit.getPVCoordinates().getVelocity()), delta= 1.0e-11)
-        self.assertAlmostEquals(0.0, finalOrbit.getA() - initialOrbit.getA(), delta=0.0)
+        self.assertAlmostEqual(0.0, finalOrbit.getA() - initialOrbit.getA(), delta=0.0)
 
     def test_compareToNumericalPropagation(self):
 
@@ -86,7 +86,7 @@ class BrouwerLyddanePropagatorTest(unittest.TestCase):
         omega = FastMath.toRadians(180.0)  # perigee argument
         raan = FastMath.toRadians(261.0)  # right ascention of ascending node
         lM = 0.0 # mean anomaly
-        initialOrbit =  KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngle.TRUE,
+        initialOrbit =  KeplerianOrbit(a, e, i, omega, raan, lM, PositionAngleType.TRUE,
                                        inertialFrame, initDate, self.provider.getMu())
         # Initial state definition
         initialState =  SpacecraftState(initialOrbit)
@@ -129,14 +129,14 @@ class BrouwerLyddanePropagatorTest(unittest.TestCase):
         BLFinalState = BLextrapolator.propagate(initDate.shiftedBy(timeshift))
         BLOrbit = KeplerianOrbit.cast_(OrbitType.KEPLERIAN.convertType(BLFinalState.getOrbit()))
 
-        self.assertAlmostEquals(NumOrbit.getA(), BLOrbit.getA(), delta=0.072)
-        self.assertAlmostEquals(NumOrbit.getE(), BLOrbit.getE(), delta=0.00000028)
-        self.assertAlmostEquals(NumOrbit.getI(), BLOrbit.getI(), delta=0.000004)
-        self.assertAlmostEquals(MathUtils.normalizeAngle(NumOrbit.getPerigeeArgument(), FastMath.PI),
+        self.assertAlmostEqual(NumOrbit.getA(), BLOrbit.getA(), delta=0.2)
+        self.assertAlmostEqual(NumOrbit.getE(), BLOrbit.getE(), delta=0.00000028)
+        self.assertAlmostEqual(NumOrbit.getI(), BLOrbit.getI(), delta=0.000004)
+        self.assertAlmostEqual(MathUtils.normalizeAngle(NumOrbit.getPerigeeArgument(), FastMath.PI),
                                 MathUtils.normalizeAngle(BLOrbit.getPerigeeArgument(), FastMath.PI), delta=0.119)
-        self.assertAlmostEquals(MathUtils.normalizeAngle(NumOrbit.getRightAscensionOfAscendingNode(), FastMath.PI),
+        self.assertAlmostEqual(MathUtils.normalizeAngle(NumOrbit.getRightAscensionOfAscendingNode(), FastMath.PI),
                                 MathUtils.normalizeAngle(BLOrbit.getRightAscensionOfAscendingNode(), FastMath.PI), delta=0.000072)
-        self.assertAlmostEquals(MathUtils.normalizeAngle(NumOrbit.getTrueAnomaly(), FastMath.PI),
+        self.assertAlmostEqual(MathUtils.normalizeAngle(NumOrbit.getTrueAnomaly(), FastMath.PI),
                                 MathUtils.normalizeAngle(BLOrbit.getTrueAnomaly(), FastMath.PI), delta=0.12)
 
 
diff --git a/python_files/test/Context.py b/python_files/test/Context.py
index 2950981bab671f3f89e53a4c52e81024d20f7a54..3cfd342283953c488779d7db30a723eb2d2ebb84 100644
--- a/python_files/test/Context.py
+++ b/python_files/test/Context.py
@@ -36,7 +36,6 @@ from org.hipparchus.geometry.euclidean.threed import Vector3D
 from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
 from orekit import JArray_double
 from org.orekit.data import DataProvidersManager, ZipJarCrawler
-from org.orekit.propagation.integration import PythonAdditionalEquations
 from org.orekit.forces.gravity.potential import GravityFieldFactory
 from org.orekit.forces.gravity.potential import SHMFormatReader
 from java.io import File
@@ -46,7 +45,7 @@ from org.hipparchus.geometry.euclidean.threed import Vector3D
 from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
 
 from org.orekit.frames import FramesFactory
-from org.orekit.orbits import EquinoctialOrbit
+from org.orekit.orbits import EquinoctialOrbit, PositionAngleType
 from org.orekit.orbits import OrbitType
 from org.orekit.propagation import SpacecraftState
 from org.orekit.propagation.numerical import NumericalPropagator
@@ -59,26 +58,13 @@ from java.io import File
 
 from org.hipparchus.geometry.euclidean.threed import Rotation
 from org.hipparchus.geometry.euclidean.threed import Vector3D
-from org.hipparchus.util import Decimal64Field
 from org.hipparchus.util import FastMath
 
 from org.orekit.bodies import CelestialBodyFactory
 
 from org.orekit.frames import FramesFactory
 from org.orekit.orbits import KeplerianOrbit
-from org.orekit.orbits import PositionAngle
-from org.orekit.propagation import FieldSpacecraftState
-from org.orekit.propagation import SpacecraftState
-from org.orekit.propagation.analytical import KeplerianPropagator
-from org.orekit.time import AbsoluteDate
-from org.orekit.time import DateComponents
-from org.orekit.time import FieldAbsoluteDate
-from org.orekit.time import TimeComponents
-from org.orekit.time import TimeScalesFactory
-from org.orekit.utils import AngularCoordinates
-from org.orekit.utils import PVCoordinates
-from org.orekit.utils import PVCoordinatesProvider
-from org.orekit.attitudes import CelestialBodyPointed, SpinStabilized, InertialProvider
+
 
 # import java.util.List;
 # import java.util.Map;
@@ -97,7 +83,7 @@ from org.orekit.frames import TopocentricFrame
 from org.orekit.orbits import CartesianOrbit
 # import org.orekit.orbits.Orbit;
 # import org.orekit.orbits.OrbitType;
-# import org.orekit.orbits.PositionAngle;
+# import org.orekit.orbits.PositionAngleType;
 from org.orekit.propagation.conversion import DormandPrince853IntegratorBuilder
 from org.orekit.propagation.conversion import NumericalPropagatorBuilder
 # import org.orekit.time.TimeScale;
@@ -126,7 +112,7 @@ class Context():
     # // Map value = slave station associated
     # public Map<GroundStation, GroundStation>     TARstations;
 
-    def createBuilder(self, orbitType, positionAngle, perfectStart, minStep, maxStep, dP, *forces):
+    def createBuilder(self, orbitType, positionAngle: PositionAngleType, perfectStart, minStep, maxStep, dP, *forces):
 
         if perfectStart:
             # orbit estimation will start from a perfect orbit
diff --git a/python_files/test/EphemerisEventsTest.py b/python_files/test/EphemerisEventsTest.py
new file mode 100644
index 0000000000000000000000000000000000000000..cfd3c809e6440847018c567c2c5e8b7fb05fc7fb
--- /dev/null
+++ b/python_files/test/EphemerisEventsTest.py
@@ -0,0 +1,186 @@
+# /* Copyright 2002-2023 CS GROUP
+#  * Licensed to CS GROUP (CS) under one or more
+#  * contributor license agreements.  See the NOTICE file distributed with
+#  * this work for additional information regarding copyright ownership.
+#  * CS licenses this file to You 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.
+#  */
+# package org.orekit.propagation.analytical;
+#
+# import org.hipparchus.ode.events.Action;
+# import org.hipparchus.util.FastMath;
+# import org.junit.jupiter.api.Assertions;
+# import org.junit.jupiter.api.BeforeEach;
+# import org.junit.jupiter.api.Test;
+# import org.orekit.Utils;
+# import org.orekit.bodies.CelestialBodyFactory;
+# import org.orekit.bodies.OneAxisEllipsoid;
+# import org.orekit.errors.OrekitException;
+# import org.orekit.frames.Frame;
+# import org.orekit.frames.FramesFactory;
+# import org.orekit.orbits.KeplerianOrbit;
+# import org.orekit.orbits.Orbit;
+# import org.orekit.orbits.OrbitType;
+# import org.orekit.orbits.PositionAngleType;
+# import org.orekit.propagation.BoundedPropagator;
+# import org.orekit.propagation.Propagator;
+# import org.orekit.propagation.SpacecraftState;
+# import org.orekit.propagation.SpacecraftStateInterpolator;
+# import org.orekit.propagation.events.EclipseDetector;
+# import org.orekit.propagation.events.EventDetector;
+# import org.orekit.propagation.events.handlers.EventHandler;
+# import org.orekit.time.AbsoluteDate;
+# import org.orekit.time.DateComponents;
+# import org.orekit.time.TimeComponents;
+# import org.orekit.time.TimeInterpolator;
+# import org.orekit.time.TimeScalesFactory;
+# import org.orekit.utils.IERSConventions;
+#
+# import java.util.ArrayList;
+# import java.util.List;
+import orekit
+from org.orekit.propagation.analytical import Ephemeris, EcksteinHechlerPropagator
+
+orekit.initVM()
+import unittest
+
+
+from org.hipparchus.ode.events import Action
+from org.hipparchus.util import FastMath
+from org.orekit.bodies import CelestialBodyFactory, OneAxisEllipsoid
+from org.orekit.errors import OrekitException
+from org.orekit.frames import Frame, FramesFactory
+from org.orekit.orbits import KeplerianOrbit, Orbit, OrbitType, PositionAngleType
+from org.orekit.propagation import BoundedPropagator, Propagator, SpacecraftState, SpacecraftStateInterpolator
+from org.orekit.propagation.events import EclipseDetector, EventDetector
+from org.orekit.propagation.events.handlers import EventHandler, PythonEventHandler
+from org.orekit.time import AbsoluteDate, DateComponents, TimeComponents, TimeScalesFactory
+from org.orekit.utils import IERSConventions
+from java.util import ArrayList, List
+
+
+from orekit.pyhelpers import setup_orekit_curdir
+
+setup_orekit_curdir("resources")
+
+
+class MyEventHandler(PythonEventHandler):
+    
+    orb_type = None
+    mainclass = None
+    
+    def __init__(self, orb_type:OrbitType, mainclass):
+        self.orb_type = orb_type
+        self.mainclass = mainclass
+        super(MyEventHandler, self).__init__()
+    
+
+    def init(self, *args):
+        self.mainclass.inEclipsecounter = 0
+        self.mainclass.outEclipsecounter = 0
+
+    def eventOccurred(self, s: SpacecraftState, eventDetector: EventDetector, increasing: bool) -> Action:
+        assert self.orb_type == s.getOrbit().getType()
+        if increasing:
+            mainclass.inEclipsecounter += 1
+        else:
+            mainclass.outEclipsecounter += 1
+        return Action.CONTINUE
+
+    def resetState(self, eventDetector, spacecraftState):
+        pass
+
+class EphemerisEventsTest(unittest.TestCase):
+
+    def testEphemKeplerian(self):
+        self.checkEphem(OrbitType.KEPLERIAN)
+
+    def testEphemCircular(self):
+        self.checkEphem(OrbitType.CIRCULAR)
+   
+    def testEphemEquinoctial(self):
+        self.checkEphem(OrbitType.EQUINOCTIAL)
+            
+    def testEphemCartesian(self):
+        self.checkEphem(OrbitType.CARTESIAN)
+    
+    def buildEphem(self, orb_type: OrbitType):
+        mass = 2500.0
+        a = 7187990.1979844316
+        e = 0.5e-4
+        i = 1.7105407051081795
+        omega = 1.9674147913622104
+        OMEGA = FastMath.toRadians(261.0)
+        lv = 0.0
+        mu  = 3.9860047e14
+        ae  = 6.378137e6
+        c20 = -1.08263e-3
+        c30 = 2.54e-6
+        c40 = 1.62e-6
+        c50 = 2.3e-7
+        c60 = -5.5e-7
+
+        deltaT = self.finalDate.durationFrom(self.initDate)
+
+        frame = FramesFactory.getEME2000()
+
+        transPar = KeplerianOrbit(a, e, i, omega, OMEGA, lv, PositionAngleType.TRUE, frame, self.initDate, mu)
+
+        nbIntervals = 720
+        propagator = EcksteinHechlerPropagator(transPar, mass, ae, mu, c20, c30, c40, c50, c60)
+
+        tab = ArrayList(nbIntervals + 1)
+        for j in range(nbIntervals + 1):
+            state = propagator.propagate(self.initDate.shiftedBy((j * deltaT) / nbIntervals))
+            tab.add(SpacecraftState(orb_type.convertType(state.getOrbit()), state.getAttitude(), state.getMass()))
+
+        interpolator = SpacecraftStateInterpolator(2, frame, frame)
+
+        return Ephemeris(tab, interpolator)
+
+    def buildEclipseDetector(self, orb_type: OrbitType):
+        sunRadius = 696000000.
+        earthRadius = 6400000.
+
+        ecl = EclipseDetector(CelestialBodyFactory.getSun(), sunRadius,
+                              OneAxisEllipsoid(earthRadius,
+                                               0.0,
+                                               FramesFactory.getITRF(IERSConventions.IERS_2010, True)))
+        ecl = ecl.withMaxCheck(60.0).withThreshold(1.0e-3).withHandler(MyEventHandler(orb_type, self))
+        return ecl
+
+
+    def checkEphem(self, orb_type:OrbitType):
+        self.initDate = AbsoluteDate(DateComponents(2004, 1, 1),
+                                        TimeComponents.H00,
+                                        TimeScalesFactory.getUTC())
+
+
+        self.finalDate = AbsoluteDate(DateComponents(2004, 1, 2),
+                            TimeComponents.H00,
+                                        TimeScalesFactory.getUTC())
+
+        ephem = self.buildEphem(orb_type)
+
+        ephem.addEventDetector(self.buildEclipseDetector(orb_type))
+
+        computeEnd = AbsoluteDate(self.finalDate, -1000.0)
+
+        Propagator.cast_(ephem).clearStepHandlers()
+        state = Propagator.cast_(ephem).propagate(computeEnd)
+        handler = ephem.getEventsDetectors().iterator().next().getHandler()
+        self.assertEqual(computeEnd, state.getDate())
+        self.assertEqual(14, self.inEclipsecounter)
+        self.assertEquals(14, self.outEclipsecounter)
+
+    def setUp(self):
+        pass
diff --git a/python_files/test/EstimationTestUtils.py b/python_files/test/EstimationTestUtils.py
index c3aee8aecfdb5e753479d2af6b78c45dc1f16af1..b8c6d08f97a7ad07135a241571fb28cbd11729b2 100644
--- a/python_files/test/EstimationTestUtils.py
+++ b/python_files/test/EstimationTestUtils.py
@@ -74,7 +74,7 @@ from org.orekit.models.earth.displacement import StationDisplacement
 from org.orekit.models.earth.displacement import TidalDisplacement;
 from org.orekit.orbits import KeplerianOrbit
 # from org.orekit.orbits.Orbit;
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 # from org.orekit.propagation.Propagator;
 # from org.orekit.propagation.conversion.PropagatorBuilder;
 # from org.orekit.propagation.numerical.NumericalPropagator;
@@ -133,7 +133,7 @@ class EstimationTestUtils():
                                                                      map))
         context.gravity = GravityFieldFactory.getNormalizedProvider(20, 20)
         context.initialOrbit = KeplerianOrbit(15000000.0, 0.125, 1.25,
-                                              0.250, 1.375, 0.0625, PositionAngle.TRUE,
+                                              0.250, 1.375, 0.0625, PositionAngleType.TRUE,
                                               FramesFactory.getEME2000(),
                                               AbsoluteDate(2000, 2, 24, 11, 35, 47.0, context.utc),
                                               context.gravity.getMu())
@@ -159,7 +159,7 @@ class EstimationTestUtils():
         # override orbital parameters
         orbitArray = JArray_double(6)
         propagatorBuilder.getOrbitType().mapOrbitToArray(initialOrbit,
-                                                         propagatorBuilder.getPositionAngle(),
+                                                         propagatorBuilder.getPositionAngleType(),
                                                          orbitArray, None);
         for i in range(0, len(orbitArray)-1):
             propagatorBuilder.getOrbitalParametersDrivers().getDrivers().get(i).setValue(orbitArray[i])
@@ -219,7 +219,7 @@ public class EstimationTestUtils {
                                                                          map));
         context.gravity = GravityFieldFactory.getNormalizedProvider(20, 20);
         context.initialOrbit = new KeplerianOrbit(15000000.0, 0.125, 1.25,
-                                                  0.250, 1.375, 0.0625, PositionAngle.TRUE,
+                                                  0.250, 1.375, 0.0625, PositionAngleType.TRUE,
                                                   FramesFactory.getEME2000(),
                                                   new AbsoluteDate(2000, 2, 24, 11, 35, 47.0, context.utc),
                                                   context.gravity.getMu());
@@ -474,7 +474,7 @@ public class EstimationTestUtils {
      */
     public static void checkKalmanFit(final Context context, final KalmanEstimator kalman,
                                       final List<ObservedMeasurement<?>> measurements,
-                                      final Orbit refOrbit, final PositionAngle positionAngle,
+                                      final Orbit refOrbit, final PositionAngleType positionAngle,
                                       final double expectedDeltaPos, final double posEps,
                                       final double expectedDeltaVel, final double velEps,
                                       final double[] expectedSigmasPos,final double sigmaPosEps,
@@ -482,7 +482,7 @@ public class EstimationTestUtils {
         {
         checkKalmanFit(context, kalman, measurements,
                        new Orbit[] { refOrbit },
-                       new PositionAngle[] { positionAngle },
+                       new PositionAngleType[] { positionAngle },
                        new double[] { expectedDeltaPos }, new double[] { posEps },
                        new double[] { expectedDeltaVel }, new double[] { velEps },
                        new double[][] { expectedSigmasPos }, new double[] { sigmaPosEps },
@@ -506,7 +506,7 @@ public class EstimationTestUtils {
      */
     public static void checkKalmanFit(final Context context, final KalmanEstimator kalman,
                                       final List<ObservedMeasurement<?>> measurements,
-                                      final Orbit[] refOrbit, final PositionAngle[] positionAngle,
+                                      final Orbit[] refOrbit, final PositionAngleType[] positionAngle,
                                       final double[] expectedDeltaPos, final double[] posEps,
                                       final double[] expectedDeltaVel, final double []velEps,
                                       final double[][] expectedSigmasPos,final double[] sigmaPosEps,
diff --git a/python_files/test/EventDetectorTest.py b/python_files/test/EventDetectorTest.py
index 334152811e5809d530e8133a91080f4d35ee862b..8fd439a656bfbd23694bb93029954209c364a016 100644
--- a/python_files/test/EventDetectorTest.py
+++ b/python_files/test/EventDetectorTest.py
@@ -23,6 +23,7 @@
  """
 
 import orekit
+from org.orekit.propagation import SpacecraftState
 
 orekit.initVM()
 # orekit.initVM(vmargs='-Xcheck:jni,-verbose:jni,-verbose:class,-XX:+UnlockDiagnosticVMOptions')
@@ -34,10 +35,9 @@ from org.orekit.orbits import KeplerianOrbit
 from org.orekit.utils import Constants
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.utils import PVCoordinates, IERSConventions
-from org.orekit.propagation.events.handlers import EventHandler
+from org.orekit.propagation.events.handlers import EventHandler, ContinueOnEvent, StopOnEvent, PythonEventHandler
 from org.hipparchus.geometry.euclidean.threed import Vector3D
-from org.orekit.propagation.events.handlers import PythonEventHandler
-from org.orekit.propagation.events import PythonAbstractDetector, PythonEventDetector
+from org.orekit.propagation.events import PythonAbstractDetector, PythonEventDetector, PythonAdaptableInterval
 from org.hipparchus.ode.events import Action
 
 
@@ -51,12 +51,34 @@ from orekit.pyhelpers import setup_orekit_curdir
 setup_orekit_curdir("resources")
 
 
+class MyEventCounter(PythonEventHandler):
+    def __init__(self):
+        self.events = 0
+        super(MyEventCounter, self).__init__()
+
+    def init(self, initialstate, target, detector):
+        print(initialstate, target, detector)
+
+    def eventOccurred(self, s, detector, increasing: bool):
+        if increasing:
+            self.events +=  1
+        return Action.CONTINUE
+
+    def resetState(self, detector, oldState):
+        return oldState
+
+mycounter = MyEventCounter()
+
+class MyAdaptableInterval(PythonAdaptableInterval):
+    def currentInterval(self, s):
+        return float(PythonAbstractDetector.DEFAULT_MAXCHECK)
+
 class MyElevationDetector(PythonEventDetector):
     passes = 0
 
     def __init__(self, elevation, topo):
         self.elevation = elevation
-        self.topo = topo
+        self.topo: TopocentricFrame = topo
         super(MyElevationDetector, self).__init__()
 
     def init(self, s, T):
@@ -66,21 +88,15 @@ class MyElevationDetector(PythonEventDetector):
         return float(PythonAbstractDetector.DEFAULT_THRESHOLD)
 
     def getMaxCheckInterval(self):
-        return float(PythonAbstractDetector.DEFAULT_MAXCHECK)
+        return MyAdaptableInterval()
 
     def getMaxIterationCount(self):
         return PythonAbstractDetector.DEFAULT_MAX_ITER
 
-    def g(self, s):
+    def g(self, s: SpacecraftState):
         tmp = self.topo.getElevation(s.getPVCoordinates().getPosition(), s.getFrame(), s.getDate()) - self.elevation
         return tmp
 
-    def eventOccurred(self, s, increasing):
-        if increasing:
-            self.passes = self.passes + 1
-
-        return Action.CONTINUE
-
     def resetState(self, oldState):
         return oldState
 
@@ -90,6 +106,9 @@ class MyElevationDetector(PythonEventDetector):
     def getTopocentricFrame(self):
         return self.topo
 
+    def getHandler(self):
+        return mycounter
+
 
 class EventDetectorTest(unittest.TestCase):
 
@@ -125,8 +144,8 @@ class EventDetectorTest(unittest.TestCase):
 
         finalState = kepler.propagate(initialDate.shiftedBy(60 * 60 * 24.0 * 15))
 
-        print(detector.passes)
-        self.assertEqual(52, detector.passes)
+        print(mycounter.events)
+        self.assertEqual(52, mycounter.events)
 
 
 if __name__ == '__main__':
diff --git a/python_files/test/EventHandlerTest.py b/python_files/test/EventHandlerTest.py
index 9580237d8d0c2a4e46424432a307d0d670fa0dd1..f963f746750f8f8d0463f5a2619e8214f810269f 100644
--- a/python_files/test/EventHandlerTest.py
+++ b/python_files/test/EventHandlerTest.py
@@ -24,6 +24,8 @@ Python version translated from Java by Petrus Hyvönen, SSC 2014
  """
 
 import orekit
+from org.orekit.propagation import SpacecraftState
+
 orekit.initVM()
 
 from org.orekit.frames import FramesFactory, TopocentricFrame
@@ -34,7 +36,7 @@ from org.orekit.utils import Constants
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.utils import PVCoordinates, IERSConventions
 from org.orekit.propagation.events import ElevationDetector
-from org.orekit.propagation.events.handlers import EventHandler, PythonEventHandler
+from org.orekit.propagation.events.handlers import PythonEventHandler
 from org.hipparchus.geometry.euclidean.threed import Vector3D
 from org.orekit.propagation.events import EventsLogger
 from org.hipparchus.ode.events import Action
@@ -85,7 +87,7 @@ class EventHandlerTest(unittest.TestCase):
             def init(self, initialstate, target, detector):
                 pass
 
-            def eventOccurred(self, s, T, increasing):
+            def eventOccurred(self, s: SpacecraftState, detector, increasing):
                 return Action.CONTINUE
 
             def resetState(self, detector, oldState):
@@ -93,7 +95,7 @@ class EventHandlerTest(unittest.TestCase):
 
         #%% detectors
         detector = ElevationDetector(sta1Frame).withConstantElevation(elevation)
-        detector = detector.withHandler(myContinueOnEvent().of_(ElevationDetector))
+        detector = detector.withHandler(myContinueOnEvent())
 
         logger = EventsLogger()
         kepler.addEventDetector(logger.monitorDetector(detector))
diff --git a/python_files/test/FieldAdditionalEquationsTest.py b/python_files/test/FieldAdditionalEquationsTest.py
deleted file mode 100644
index 440507e84cbd88bc38afe147a3a06b173e4707b4..0000000000000000000000000000000000000000
--- a/python_files/test/FieldAdditionalEquationsTest.py
+++ /dev/null
@@ -1,151 +0,0 @@
-# -*- coding: utf-8 -*-
-
-
-"""
-/* Copyright 2002-2018 CS Systèmes d'Information
- * Licensed to CS Systèmes d'Information (CS) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * CS licenses this file to You 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.
- */
-
- Python version translated from Java by Petrus Hyvönen, SSC 2018
-
-"""
-
-import unittest
-import sys
-
-# Python orekit specifics
-import orekit
-
-orekit.initVM()
-
-from orekit import JArray_double
-from org.orekit.data import DataProvidersManager, ZipJarCrawler, DataContext, DirectoryCrawler
-from org.orekit.propagation.integration import PythonFieldAdditionalEquations
-from org.orekit.forces.gravity.potential import GravityFieldFactory
-from org.orekit.forces.gravity.potential import SHMFormatReader
-from java.io import File
-from java.lang import System
-
-
-from org.hipparchus.geometry.euclidean.threed import Vector3D
-from org.hipparchus import CalculusFieldElement
-
-from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
-from org.hipparchus.ode.nonstiff import DormandPrince853FieldIntegrator
-
-from org.orekit.frames import FramesFactory
-from org.orekit.orbits import EquinoctialOrbit
-from org.orekit.orbits import OrbitType
-from org.orekit.propagation import SpacecraftState, FieldSpacecraftState
-from org.orekit.propagation.numerical import NumericalPropagator, FieldNumericalPropagator
-from org.orekit.propagation.semianalytical.dsst import DSSTPropagator
-from org.orekit.time import AbsoluteDate, FieldAbsoluteDate
-from org.orekit.utils import PVCoordinates
-from org.hipparchus.util import MathArrays
-from org.hipparchus.util import Decimal64Field
-
-
-
-# The class to be the additional equation
-class InitCheckerEquations(PythonFieldAdditionalEquations):  # implements AdditionalEquations
-
-    # This is the method called for object creation as in java InitCheckerEquations(self, expected)
-    def __init__(self, expected):
-        super(InitCheckerEquations, self).__init__()
-        self.expected = expected
-        self.called = False
-
-    # Part of AdditionalEquations interface
-    def init(self, initialState, target):
-        assert (self.expected - 1.0e-15) < initialState.getAdditionalState(self.getName())[0].getReal() < (
-                    self.expected + 1.0e-15)
-        self.called = True
-
-    # Part of AdditionalEquations interface
-    def computeDerivatives(self, s, pDot):
-        zerovalue = CalculusFieldElement.cast_(s.getDate().getField().getZero()) # Not completely sure why this needs casting but becomes just an "Object" otherwise
-        pDot[0] = zerovalue.add(1.5)
-        return MathArrays.buildArray(s.getDate().getField(), 7)
-
-    # Part of AdditionalEquations interface
-    def getName(self):
-        return "linear"
-
-    def wasCalled(self):
-        return self.called
-
-
-class FieldAdditionalEquationsTest(unittest.TestCase):
-    def setUp(self):
-        # Initialize the data sources
-        DM = DataContext.getDefault().getDataProvidersManager()
-        datafile = File('resources')
-        if not datafile.exists():
-            print('File :', datafile.absolutePath, ' not found')
-
-        crawler = DirectoryCrawler(datafile)
-        DM.clearProviders()
-        DM.addProvider(crawler)
-        System.setProperty(DataProvidersManager.OREKIT_DATA_PATH, 'potential/shm-format')
-        GravityFieldFactory.addPotentialCoefficientsReader(SHMFormatReader("^eigen_cg03c_coef$", False))
-
-        mu = GravityFieldFactory.getUnnormalizedProvider(0, 0).getMu()
-        position = Vector3D(7.0e6, 1.0e6, 4.0e6)
-        velocity = Vector3D(-500.0, 8000.0, 1000.0)
-        self.initDate = AbsoluteDate.J2000_EPOCH
-        orbit = EquinoctialOrbit(PVCoordinates(position, velocity),
-                                 FramesFactory.getEME2000(), self.initDate, mu)
-        self.initialState = SpacecraftState(orbit)
-        self.tolerance = NumericalPropagator.tolerances(0.001, orbit, OrbitType.EQUINOCTIAL)
-
-        print('Setup Finished ok')
-
-    def tearDown(self):
-        self.initDate = None
-        self.initialState = None
-        self.tolerance = None
-
-    # Test for issue #401 with numerical propagator
-    def testInitNumerical(self):
-        self.doTestInitNumerical(Decimal64Field.getInstance())
-
-    def doTestInitNumerical(self, field):
-        # setup
-        reference = 1.25
-        checker = InitCheckerEquations(reference)
-        self.assertFalse(checker.wasCalled())
-
-        # action
-        integrator = DormandPrince853FieldIntegrator(field, 0.001, 200.0, JArray_double.cast_(self.tolerance[0]),
-                                                     JArray_double.cast_(self.tolerance[1]))
-        integrator.setInitialStepSize(60.0)
-        propagatorNumerical = FieldNumericalPropagator(field, integrator)
-        propagatorNumerical.setInitialState(
-            FieldSpacecraftState(field, self.initialState).addAdditionalState(checker.getName(),
-                                                                              field.getZero().add(reference)))
-        propagatorNumerical.addAdditionalEquations(checker)
-        propagatorNumerical.propagate(FieldAbsoluteDate(field, self.initDate).shiftedBy(600.0))
-
-        # verify
-        self.assertTrue(checker.wasCalled())
-
-        print('testInitNumerical finished ok')
-
-
-if __name__ == '__main__':
-    suite = unittest.TestLoader().loadTestsFromTestCase(FieldAdditionalEquationsTest)
-    ret = not unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful()
-    sys.exit(ret)
diff --git a/python_files/test/FieldStopOnDecreasingTest.py b/python_files/test/FieldStopOnDecreasingTest.py
index e28f040b619519f3db705d0f180f0113acbdd106..5eee475a7521a8b63772d74603ea8a09813db0d1 100644
--- a/python_files/test/FieldStopOnDecreasingTest.py
+++ b/python_files/test/FieldStopOnDecreasingTest.py
@@ -34,9 +34,9 @@ orekit.initVM()
 from org.orekit.frames import FramesFactory
 from org.orekit.propagation import FieldSpacecraftState
 from org.orekit.time import FieldAbsoluteDate
-from org.hipparchus.util import Decimal64Field
+from org.hipparchus.util import Binary64Field
 from org.orekit.orbits import FieldKeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.utils import Constants
 from org.orekit.propagation.events.handlers import FieldStopOnDecreasing
 from org.orekit.propagation.events.handlers import FieldEventHandler
@@ -46,13 +46,11 @@ from org.hipparchus.ode.events import Action
 class FieldStopOnDecreasingTest(unittest.TestCase):
 
     def testNoReset(self):
-        self.doTestNoReset(Decimal64Field.getInstance())
+        self.doTestNoReset(Binary64Field.getInstance())
 
     def testIncreasing(self):
-        self.doTestIncreasing(Decimal64Field.getInstance())
+        self.doTestIncreasing(Binary64Field.getInstance())
 
-    # def testDecreasing(self):
-    #    self.doTestDecreasing(Decimal64Field.getInstance())
 
     def doTestNoReset(self, field):
         zero = field.getZero()
@@ -63,7 +61,7 @@ class FieldStopOnDecreasingTest(unittest.TestCase):
                                                      zero.add(3.10686),
                                                      zero.add(1.00681),
                                                      zero.add(0.048363),
-                                                     PositionAngle.MEAN,
+                                                     PositionAngleType.MEAN,
                                                      FramesFactory.getEME2000(),
                                                      date,
                                                      zero.add(Constants.EIGEN5C_EARTH_MU)))
@@ -83,7 +81,7 @@ class FieldStopOnDecreasingTest(unittest.TestCase):
                                                      zero.add(3.10686),
                                                      zero.add(1.00681),
                                                      zero.add(0.048363),
-                                                     PositionAngle.MEAN,
+                                                     PositionAngleType.MEAN,
                                                      FramesFactory.getEME2000(),
                                                      date,
                                                      zero.add(Constants.EIGEN5C_EARTH_MU)))
@@ -107,7 +105,7 @@ class FieldStopOnDecreasingTest(unittest.TestCase):
                                                                                          zero.add(3.10686),
                                                                                          zero.add(1.00681),
                                                                                          zero.add(0.048363),
-                                                                                         PositionAngle.MEAN,
+                                                                                         PositionAngleType.MEAN,
                                                                                          FramesFactory.getEME2000(),
                                                                                          date,
                                                                                          Constants.EIGEN5C_EARTH_MU));
diff --git a/python_files/test/FixedRateTest.py b/python_files/test/FixedRateTest.py
new file mode 100644
index 0000000000000000000000000000000000000000..d756c2d03fe26d74ad7ef7d72611987261358e93
--- /dev/null
+++ b/python_files/test/FixedRateTest.py
@@ -0,0 +1,120 @@
+import unittest
+
+import orekit
+orekit.initVM()
+
+from org.hipparchus.geometry.euclidean.threed import Rotation, Vector3D
+from org.orekit.attitudes import Attitude, FixedRate
+from org.orekit.frames import FramesFactory
+from org.orekit.orbits import KeplerianOrbit
+from org.orekit.time import AbsoluteDate, DateComponents, TimeComponents, TimeScalesFactory
+from org.orekit.utils import PVCoordinates, AngularCoordinates
+from org.hipparchus.util import FastMath
+from org.orekit.orbits import PositionAngleType
+from org.orekit.propagation.analytical import KeplerianPropagator
+
+from java.io import File
+from org.orekit.data import DataContext, DirectoryCrawler
+
+class OrekitFixedRateTest(unittest.TestCase):
+    def setUp(self):
+        DM = DataContext.getDefault().getDataProvidersManager()
+        datafile = File('resources')
+        if not datafile.exists():
+            print('File :', datafile.absolutePath, ' not found')
+
+        crawler = DirectoryCrawler(datafile)
+        DM.clearProviders()
+        DM.addProvider(crawler)
+
+    def test_zero_rate(self):
+        date = AbsoluteDate(DateComponents(2004, 3, 2),
+                            TimeComponents(13, 17, 7.865),
+                            TimeScalesFactory.getUTC())
+        frame = FramesFactory.getEME2000()
+        law = FixedRate(Attitude(date, frame,
+                                 Rotation(0.48, 0.64, 0.36, 0.48, False),
+                                 Vector3D.ZERO, Vector3D.ZERO))
+        pv = PVCoordinates(Vector3D(28812595.32012577, 5948437.4640250085, 0.0),
+                           Vector3D(0.0, 0.0, 3680.853673522056))
+        orbit = KeplerianOrbit(pv, frame, date, 3.986004415e14)
+        attitude0 = law.getAttitude(orbit, date, frame).getRotation()
+        self.assertAlmostEqual(0, Rotation.distance(attitude0, law.getReferenceAttitude().getRotation()), delta=1.0e-10)
+        attitude1 = law.getAttitude(orbit.shiftedBy(10.0), date.shiftedBy(10.0), frame).getRotation()
+        self.assertAlmostEqual(0, Rotation.distance(attitude1, law.getReferenceAttitude().getRotation()), delta=1.0e-10)
+        attitude2 = law.getAttitude(orbit.shiftedBy(20.0), date.shiftedBy(20.0), frame).getRotation()
+        self.assertAlmostEqual(0, Rotation.distance(attitude2, law.getReferenceAttitude().getRotation()), delta=1.0e-10)
+
+
+    def test_non_zero_rate(self):
+        date = AbsoluteDate(DateComponents(2004, 3, 2),
+                            TimeComponents(13, 17, 7.865),
+                            TimeScalesFactory.getUTC())
+        rate = 2 * FastMath.PI / (12 * 60)
+        frame = FramesFactory.getEME2000()
+        gcrf = FramesFactory.getGCRF()
+        law = FixedRate(Attitude(date, frame,
+                                 Rotation(0.48, 0.64, 0.36, 0.48, False),
+                                 Vector3D(rate, Vector3D.PLUS_K), Vector3D.ZERO))
+        ref = law.getReferenceAttitude().getRotation().applyTo(gcrf.getTransformTo(frame, date).getRotation())
+        pv = PVCoordinates(Vector3D(28812595.32012577, 5948437.4640250085, 0.0),
+                           Vector3D(0.0, 0.0, 3680.853673522056))
+        orbit = KeplerianOrbit(pv, frame, date, 3.986004415e14)
+        attitude0 = law.getAttitude(orbit, date, gcrf).getRotation()
+        self.assertAlmostEqual(0, Rotation.distance(attitude0, ref), delta=1.0e-10)
+        attitude1 = law.getAttitude(orbit.shiftedBy(10.0), date.shiftedBy(10.0), gcrf).getRotation()
+        self.assertAlmostEqual(10 * rate, Rotation.distance(attitude1, ref), delta=1.0e-10)
+        attitude2 = law.getAttitude(orbit.shiftedBy(-20.0), date.shiftedBy(-20.0), gcrf).getRotation()
+        self.assertAlmostEqual(20 * rate, Rotation.distance(attitude2, ref), delta=1.0e-10)
+        self.assertAlmostEqual(30 * rate, Rotation.distance(attitude2, attitude1), delta=1.0e-10)
+        attitude3 = law.getAttitude(orbit.shiftedBy(0.0), date, frame).getRotation()
+        self.assertAlmostEqual(0, Rotation.distance(attitude3, law.getReferenceAttitude().getRotation()), delta=1.0e-10)
+
+
+    def test_spin(self):
+        date = AbsoluteDate(DateComponents(1970, 1, 1),
+                            TimeComponents(3, 25, 45.6789),
+                            TimeScalesFactory.getUTC())
+
+        rate = 2 * FastMath.PI / (12 * 60)
+        law = FixedRate(Attitude(date, FramesFactory.getEME2000(),
+                                 Rotation(0.48, 0.64, 0.36, 0.48, False),
+                                 Vector3D(rate, Vector3D.PLUS_K),
+                                 Vector3D.ZERO))
+
+        orbit = KeplerianOrbit(7178000.0, 1.e-4, FastMath.toRadians(50.0),
+                               FastMath.toRadians(10.0), FastMath.toRadians(20.0),
+                               FastMath.toRadians(30.0), PositionAngleType.MEAN,
+                               FramesFactory.getEME2000(), date, 3.986004415e14)
+
+        propagator = KeplerianPropagator(orbit, law)
+
+        h = 0.01
+        s_minus = propagator.propagate(date.shiftedBy(-h))
+        s0 = propagator.propagate(date)
+        s_plus = propagator.propagate(date.shiftedBy(h))
+
+        error_angle_minus = Rotation.distance(s_minus.shiftedBy(h).getAttitude().getRotation(),
+                                              s0.getAttitude().getRotation())
+        evolution_angle_minus = Rotation.distance(s_minus.getAttitude().getRotation(),
+                                                  s0.getAttitude().getRotation())
+        self.assertAlmostEqual(0.0, error_angle_minus, delta=1.0e-6 * evolution_angle_minus)
+
+        error_angle_plus = Rotation.distance(s0.getAttitude().getRotation(),
+                                             s_plus.shiftedBy(-h).getAttitude().getRotation())
+        evolution_angle_plus = Rotation.distance(s0.getAttitude().getRotation(),
+                                                 s_plus.getAttitude().getRotation())
+        self.assertAlmostEqual(0.0, error_angle_plus, delta=1.0e-6 * evolution_angle_plus)
+
+        spin0 = s0.getAttitude().getSpin()
+        reference = AngularCoordinates.estimateRate(s_minus.getAttitude().getRotation(),
+                                                    s_plus.getAttitude().getRotation(),
+                                                    2 * h)
+        self.assertAlmostEqual(0.0, spin0.subtract(reference).getNorm(), delta=1.0e-14)
+
+
+
+if __name__ == '__main__':
+    suite = unittest.TestLoader().loadTestsFromTestCase(OrekitFixedRateTest)
+    unittest.TextTestRunner(verbosity=2).run(suite)
+
diff --git a/python_files/test/GroundFieldOfViewDetectorTest.py b/python_files/test/GroundFieldOfViewDetectorTest.py
index b95e042dab5c51a5717da6478566b5150ca7a10b..364ead59866e93eb9d71254c5a98f61abea9cb51 100644
--- a/python_files/test/GroundFieldOfViewDetectorTest.py
+++ b/python_files/test/GroundFieldOfViewDetectorTest.py
@@ -30,7 +30,7 @@ orekit.initVM()
 from org.orekit.frames import FramesFactory, TopocentricFrame
 from org.orekit.bodies import OneAxisEllipsoid, GeodeticPoint
 from org.orekit.time import AbsoluteDate
-from org.orekit.orbits import KeplerianOrbit, PositionAngle
+from org.orekit.orbits import KeplerianOrbit, PositionAngleType
 from org.orekit.utils import Constants
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.utils import IERSConventions
@@ -67,7 +67,7 @@ class GroundFieldOfViewDetectorTest(unittest.TestCase):
         # iss like orbit
         orbit = KeplerianOrbit(
             6378137.0 + 400e3, 0.0, radians(51.65), 0.0, 0.0, 0.0,
-            PositionAngle.TRUE, eci, date, Constants.EGM96_EARTH_MU)
+            PositionAngleType.TRUE, eci, date, Constants.EGM96_EARTH_MU)
 
         prop = KeplerianPropagator(orbit)
 
diff --git a/python_files/test/GroundPointingTest.py b/python_files/test/GroundPointingTest.py
new file mode 100644
index 0000000000000000000000000000000000000000..31a838aabbf78d45525f29f26914ee9994371979
--- /dev/null
+++ b/python_files/test/GroundPointingTest.py
@@ -0,0 +1,145 @@
+# Python orekit specifics
+import sys
+import orekit
+orekit.initVM()
+
+
+
+import unittest
+from typing import Union
+from org.orekit.data import DataProvidersManager, ZipJarCrawler, DataContext, DirectoryCrawler
+from java.io import File
+
+from orekit import JArray_double
+from orekit.pyhelpers import absolutedate_to_datetime
+from org.hipparchus import CalculusFieldElement
+from org.hipparchus.analysis.differentiation import GradientField, UnivariateDerivative1, UnivariateDerivative2
+from org.hipparchus.complex import ComplexField
+from org.hipparchus.geometry.euclidean.threed import FieldRotation, FieldVector3D, Rotation, Vector3D
+from org.hipparchus.util import Binary64Field
+from org.orekit.attitudes import GroundPointing, PythonGroundPointing
+from org.orekit.frames import FramesFactory, Frame
+from org.orekit.orbits import EquinoctialOrbit, FieldEquinoctialOrbit, PositionAngleType
+from org.orekit.time import AbsoluteDate, FieldAbsoluteDate
+from org.orekit.utils import IERSConventions, Constants, PVCoordinatesProvider, TimeStampedPVCoordinates, FieldPVCoordinatesProvider, TimeStampedFieldPVCoordinates, PVCoordinates, FieldPVCoordinates
+import unittest
+from org.hipparchus.analysis.differentiation import GradientField, UnivariateDerivative2
+
+
+# class TestGroundPointing(PythonGroundPointing):
+#     def getTargetPV(self, pvProv, date, frame) -> Union[TimeStampedPVCoordinates,TimeStampedFieldPVCoordinates]:
+#         if isinstance(pvProv, FieldPVCoordinatesProvider):
+#             return TimeStampedFieldPVCoordinates(date, FieldPVCoordinates.getZero(date.getField()))
+
+#         elif isinstance(pvProv, PVCoordinatesProvider):
+#             return TimeStampedPVCoordinates(date, PVCoordinates.ZERO)
+
+#         else:
+#             raise RuntimeError(f'Not supported type of PVCoordinatesProvider: {type(pvProv).__name__}')
+
+
+class TestGroundPointing(PythonGroundPointing):
+    def getTargetPV(self, pvProv, date, frame) -> Union[TimeStampedPVCoordinates,TimeStampedFieldPVCoordinates]:
+        match ([pvProv, date, frame]):
+            case [FieldPVCoordinatesProvider(), _,_]:
+                return TimeStampedFieldPVCoordinates(date, FieldPVCoordinates.getZero(date.getField()))
+            
+            case [PVCoordinatesProvider(), _,_]:
+                return TimeStampedPVCoordinates(date, PVCoordinates.ZERO)
+
+            case _:
+                raise RuntimeError(f'Not supported type of PVCoordinatesProvider: {type(pvProv).__name__}')
+
+
+class GroundPointingTest(unittest.TestCase):
+    INERTIAL_FRAME = None
+    OTHER_INERTIAL_FRAME = None
+    EARTH_FIXED_FRAME = None
+
+    def setUp(self):
+        
+        DM = DataContext.getDefault().getDataProvidersManager()
+        datafile = File('../test/resources')
+        if not datafile.exists():
+            print('File :', datafile.absolutePath, ' not found')
+
+        crawler = DirectoryCrawler(datafile)
+        DM.clearProviders()
+        DM.addProvider(crawler)
+        self.INERTIAL_FRAME = FramesFactory.getEME2000()
+        self.OTHER_INERTIAL_FRAME = FramesFactory.getGCRF()
+        self.EARTH_FIXED_FRAME = FramesFactory.getITRF(IERSConventions.IERS_2010, True)
+
+    def createPVCoordinatesProvider(self):
+        epoch = AbsoluteDate.ARBITRARY_EPOCH
+        semiMajorAxis = 45000.0e3
+        mu = Constants.EGM96_EARTH_MU
+        return EquinoctialOrbit(semiMajorAxis, 0., 0., 0., 0., 0., PositionAngleType.ECCENTRIC, self.INERTIAL_FRAME, epoch, mu)
+
+    def templateTestGetRotation(self, frame):
+        # setup
+        groundPointing = TestGroundPointing(self.INERTIAL_FRAME, self.EARTH_FIXED_FRAME)
+        orbit = self.createPVCoordinatesProvider()
+
+        actualRotation = groundPointing.getAttitudeRotation(orbit, orbit.getDate(), frame)
+        # verify
+        attitude = groundPointing.getAttitude(orbit, orbit.getDate(), frame)
+        expectedRotation = attitude.getRotation()
+        self.assertEqual(0., Rotation.distance(expectedRotation, actualRotation))
+
+    def testtemplateTestGetRotationRateSameFrame(self):
+        self.templateTestGetRotation(self.INERTIAL_FRAME)
+
+    def testtemplateTestGetRotationRateDifferentFrame(self):
+        self.templateTestGetRotation(self.OTHER_INERTIAL_FRAME)
+
+    def testGetAttitudeRotiationFieldSameFrame(self):
+        self.templateTestGetRotationField(ComplexField.getInstance(), self.INERTIAL_FRAME)
+
+    def testGetAttitudeRotiationFieldDifferentFrame(self):
+        self.templateTestGetRotationField(UnivariateDerivative1(0., 0.).getField(), self.OTHER_INERTIAL_FRAME)
+
+    def templateTestGetRotationField(self, field, frame):
+        # GIVEN
+        groundPointing = TestGroundPointing(self.INERTIAL_FRAME, self.EARTH_FIXED_FRAME)
+        orbit = self.createPVCoordinatesProvider()
+        fieldOrbit = self.convertToField(field, orbit)
+        # WHEN
+        actualRotation = groundPointing.getAttitudeRotation(fieldOrbit, fieldOrbit.getDate(), frame)
+        # THEN
+        attitude = groundPointing.getAttitude(fieldOrbit, fieldOrbit.getDate(), frame)
+        expectedRotation = attitude.getRotation()
+        assert 0. == Rotation.distance(expectedRotation.toRotation(), actualRotation.toRotation())
+
+
+    def testGetAttitudeFieldGradient(self):
+        self.templateTestGetAttitudeField(GradientField.getField(1))
+
+    def testGetAttitudeFieldUnivariateDerivative2(self):
+        self.templateTestGetAttitudeField(UnivariateDerivative2(0., 0., 0.).getField())
+
+
+
+    def templateTestGetAttitudeField(self, field):
+        groundPointing = TestGroundPointing(self.INERTIAL_FRAME, self.EARTH_FIXED_FRAME)
+        orbit = self.createPVCoordinatesProvider()
+        fieldOrbit = self.convertToField(field, orbit)
+        actualAttitude = groundPointing.getAttitude(fieldOrbit, fieldOrbit.getDate(), self.OTHER_INERTIAL_FRAME).toAttitude()
+        expectedAttitude = groundPointing.getAttitude(orbit, orbit.getDate(), self.OTHER_INERTIAL_FRAME)
+        assert 0. == Rotation.distance(expectedAttitude.getRotation(), actualAttitude.getRotation())
+        assert str(expectedAttitude.getSpin()) == str(actualAttitude.getSpin())
+        assert str(expectedAttitude.getRotationAcceleration()) == str(actualAttitude.getRotationAcceleration())
+
+    def convertToField(self, field, orbit) -> FieldEquinoctialOrbit:
+        zero = field.getZero()
+        fieldSemiMajorAxis = zero.add(orbit.getA())
+        fieldDate = FieldAbsoluteDate(field, orbit.getDate())
+        positionAngleType = PositionAngleType.MEAN
+        fieldAngle = zero.add(orbit.getL(positionAngleType))
+        return FieldEquinoctialOrbit(fieldSemiMajorAxis, zero, zero, zero, zero, fieldAngle, positionAngleType, orbit.getFrame(), fieldDate, zero.add(orbit.getMu()))
+
+
+if __name__ == '__main__':
+    suite = unittest.TestLoader().loadTestsFromTestCase(GroundPointingTest)
+    ret = not unittest.TextTestRunner(verbosity=2).run(suite).wasSuccessful()
+    sys.exit(ret)
diff --git a/python_files/test/ImpulseManeuverTest.py b/python_files/test/ImpulseManeuverTest.py
index 1eb26c2b25300f46593e750cf0312155fef65269..179af786f48822420a95d249869cb3300bcd6312 100644
--- a/python_files/test/ImpulseManeuverTest.py
+++ b/python_files/test/ImpulseManeuverTest.py
@@ -35,7 +35,7 @@ from org.orekit.attitudes import LofOffset
 from org.orekit.frames import FramesFactory
 from org.orekit.frames import LOFType
 from org.orekit.orbits import KeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.propagation.events import NodeDetector
 from org.orekit.time import AbsoluteDate
@@ -56,7 +56,7 @@ class ImpulseManeuverTest(unittest.TestCase):
                                       FastMath.PI,
                                       0.4,
                                       2.0,
-                                   PositionAngle.MEAN,
+                                   PositionAngleType.MEAN,
                                    FramesFactory.getEME2000(),
                                    AbsoluteDate(DateComponents(2008, 6, 23),
                                                     TimeComponents(14, 18, 37.0),
diff --git a/python_files/test/InterSatDirectViewDetectorTest.py b/python_files/test/InterSatDirectViewDetectorTest.py
index a42852574508736fba4fc073eb7cd3bbe2068086..93a74798b4cc773e2cff6a36e2b91708a156943d 100644
--- a/python_files/test/InterSatDirectViewDetectorTest.py
+++ b/python_files/test/InterSatDirectViewDetectorTest.py
@@ -35,7 +35,7 @@ setup_orekit_curdir("resources")
 from org.orekit.propagation.events import EventsLogger
 from org.hipparchus.util import FastMath
 from org.orekit.frames import FramesFactory
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.time import AbsoluteDate
 from org.orekit.time import TimeScalesFactory
 from org.orekit.utils import Constants
@@ -89,6 +89,9 @@ class GrazingHandler(PythonEventHandler):
     def resetState(self, detector, oldState):
         pass
 
+    def getHandler(self):
+        pass
+
 
 class InterSatDirectViewDetectorTest(unittest.TestCase):
 
@@ -99,13 +102,13 @@ class InterSatDirectViewDetectorTest(unittest.TestCase):
         utc = TimeScalesFactory.getUTC()
         o1 = CircularOrbit(7200000.0, 1.0e-3, 2.0e-4,
                            FastMath.toRadians(98.7), FastMath.toRadians(134.0),
-                           FastMath.toRadians(21.0), PositionAngle.MEAN, FramesFactory.getGCRF(),
+                           FastMath.toRadians(21.0), PositionAngleType.MEAN, FramesFactory.getGCRF(),
                            AbsoluteDate("2003-02-14T01:02:03.000", utc),
                            Constants.EIGEN5C_EARTH_MU)
 
         o2 = CircularOrbit(o1.getA(), 2.0e-4, 1.0e-3,
                            o1.getI() + 1.0e-6, o1.getRightAscensionOfAscendingNode() - 3.5e-7,
-                           o1.getAlphaM() + 2.2e-6, PositionAngle.MEAN, o1.getFrame(),
+                           o1.getAlphaM() + 2.2e-6, PositionAngleType.MEAN, o1.getFrame(),
                            o1.getDate(),
                            Constants.EIGEN5C_EARTH_MU)
 
@@ -142,13 +145,13 @@ class InterSatDirectViewDetectorTest(unittest.TestCase):
         utc = TimeScalesFactory.getUTC()
         o1 = CircularOrbit(7200000.0, 1.0e-3, 2.0e-4,
                            FastMath.toRadians(50.0), FastMath.toRadians(134.0),
-                           FastMath.toRadians(21.0), PositionAngle.MEAN, FramesFactory.getGCRF(),
+                           FastMath.toRadians(21.0), PositionAngleType.MEAN, FramesFactory.getGCRF(),
                            AbsoluteDate("2003-02-14T01:02:03.000", utc),
                            Constants.EIGEN5C_EARTH_MU)
 
         o2 = CircularOrbit(29600000.0, 2.0e-4, 1.0e-3,
                            FastMath.toRadians(56.0), FastMath.toRadians(111.0),
-                           o1.getAlphaM() + 2.2e-6, PositionAngle.MEAN, o1.getFrame(),
+                           o1.getAlphaM() + 2.2e-6, PositionAngleType.MEAN, o1.getFrame(),
                            o1.getDate(),
                            Constants.EIGEN5C_EARTH_MU)
 
@@ -157,7 +160,7 @@ class InterSatDirectViewDetectorTest(unittest.TestCase):
         loggerA = EventsLogger()
         pA.addEventDetector(loggerA.monitorDetector(InterSatDirectViewDetector(earth, o2).
                                                     withMaxCheck(10.0).
-                                                    withHandler(GrazingHandler().of_(InterSatDirectViewDetector))))
+                                                    withHandler(GrazingHandler())))
 
         propdate = o1.getDate().shiftedBy(4 * o1.getKeplerianPeriod())
         pA.propagate(propdate)
@@ -169,7 +172,7 @@ class InterSatDirectViewDetectorTest(unittest.TestCase):
         loggerB = EventsLogger()
         pB.addEventDetector(loggerB.monitorDetector(InterSatDirectViewDetector(earth, o1).
                                                     withMaxCheck(10.0).
-                                                    withHandler(GrazingHandler().of_(InterSatDirectViewDetector))))
+                                                    withHandler(GrazingHandler())))
 
         pB.propagate(o1.getDate().shiftedBy(4 * o1.getKeplerianPeriod()))
         self.assertEqual(7, loggerB.getLoggedEvents().size())
diff --git a/python_files/test/IodGibbsTest.py b/python_files/test/IodGibbsTest.py
index 5a1341af12767d7400d6f0437819ceff34b4cc3e..b81854b28a357712731f3018ffac9bdfb921328d 100644
--- a/python_files/test/IodGibbsTest.py
+++ b/python_files/test/IodGibbsTest.py
@@ -36,18 +36,10 @@ from java.io import File
 # import java.util.List;
 #
 from org.hipparchus.geometry.euclidean.threed import Vector3D
-# import org.junit.Assert;
-# import org.junit.Test;
-# import org.orekit.estimation.Context;
-# from org.orekit.estimation import EstimationTestUtils
-# import org.orekit.estimation.measurements.ObservedMeasurement;
-# import org.orekit.estimation.measurements.PV;
-# import org.orekit.estimation.measurements.PVMeasurementCreator;
-# import org.orekit.frames.Frame;
 from org.orekit.frames import FramesFactory
 # import org.orekit.orbits.KeplerianOrbit;
 from org.orekit.orbits import OrbitType
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 # import org.orekit.propagation.Propagator;
 # import org.orekit.propagation.conversion.NumericalPropagatorBuilder;
 from org.orekit.time import AbsoluteDate, TimeScalesFactory
@@ -68,7 +60,7 @@ class IodGibbsTest(unittest.TestCase):
         mu = context.initialOrbit.getMu()
         frame = context.initialOrbit.getFrame()
 
-        propagatorBuilder = context.createBuilder(OrbitType.KEPLERIAN, PositionAngle.TRUE, True, 1.0e-6, 60.0, 0.001)
+        propagatorBuilder = context.createBuilder(OrbitType.KEPLERIAN, PositionAngleType.TRUE, True, 1.0e-6, 60.0, 0.001)
 
         # create perfect range measurements
         propagator = EstimationTestUtils().createPropagator(context.initialOrbit, propagatorBuilder)
@@ -89,9 +81,9 @@ class IodGibbsTest(unittest.TestCase):
         gibbs = IodGibbs(mu)
         orbit = gibbs.estimate(frame, pv1, pv2, pv3)
 
-        self.assertAlmostEquals(context.initialOrbit.getA(), orbit.getA(), delta=1.0e-9 * context.initialOrbit.getA())
-        self.assertAlmostEquals(context.initialOrbit.getE(), orbit.getE(), delta=1.0e-9 * context.initialOrbit.getA())
-        self.assertAlmostEquals(context.initialOrbit.getI(), orbit.getI(), delta=1.0e-9 * context.initialOrbit.getA())
+        self.assertAlmostEqual(context.initialOrbit.getA(), orbit.getA(), delta=1.0e-9 * context.initialOrbit.getA())
+        self.assertAlmostEqual(context.initialOrbit.getE(), orbit.getE(), delta=1.0e-9 * context.initialOrbit.getA())
+        self.assertAlmostEqual(context.initialOrbit.getI(), orbit.getI(), delta=1.0e-9 * context.initialOrbit.getA())
 
         pass
 
@@ -123,7 +115,7 @@ class IodGibbsTest(unittest.TestCase):
                                 posR1, dateRef, posR2, date2, posR3, date3)
 
         # test
-        self.assertAlmostEquals(0.0, orbit.getPVCoordinates().getVelocity().getNorm() - velR2.getNorm(), delta=1e-3)
+        self.assertAlmostEqual(0.0, orbit.getPVCoordinates().getVelocity().getNorm() - velR2.getNorm(), delta=1e-3)
 
 
 if __name__ == '__main__':
diff --git a/python_files/test/IodLaplaceTest.py b/python_files/test/IodLaplaceTest.py
index ae9360426047422bd4c500d2c6ee77ad2ac387dc..7b218673d8660b18854ce4ddc9a55af2bd319fa4 100644
--- a/python_files/test/IodLaplaceTest.py
+++ b/python_files/test/IodLaplaceTest.py
@@ -39,20 +39,12 @@ from java.io import File
 # import java.util.List;
 #
 from org.hipparchus.geometry.euclidean.threed import Vector3D
-# import org.junit.Assert;
-# import org.junit.Test;
-# import org.orekit.estimation.Context;
 from org.hipparchus.util import FastMath
 
-# from org.orekit.estimation import EstimationTestUtils
-# import org.orekit.estimation.measurements.ObservedMeasurement;
-# import org.orekit.estimation.measurements.PV;
-# import org.orekit.estimation.measurements.PVMeasurementCreator;
-# import org.orekit.frames.Frame;
 from org.orekit.frames import FramesFactory, TopocentricFrame
 # import org.orekit.orbits.KeplerianOrbit;
 from org.orekit.orbits import OrbitType, KeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 # import org.orekit.propagation.Propagator;
 from org.orekit.propagation.analytical import KeplerianPropagator
 from org.orekit.propagation.analytical.tle import TLE, TLEPropagator
@@ -149,15 +141,15 @@ class IodLaplaceTest(unittest.TestCase):
         date = AbsoluteDate(2019, 9, 29, 22, 0, 2.0, TimeScalesFactory.getUTC())
         kep = KeplerianOrbit(6798938.970424857, 0.0021115522920270016, 0.9008866630545347,
     						      1.8278985811406743, -2.7656136723308524,
-    						      0.8823034512437679, PositionAngle.MEAN, self.gcrf,
+    						      0.8823034512437679, PositionAngleType.MEAN, self.gcrf,
     						      date, Constants.EGM96_EARTH_MU)
 
         prop = KeplerianPropagator(kep)
 
         # With only 3 measurements, we can expect ~400 meters error in position and ~1 m/s in velocity
         error = self.estimateOrbit(prop, date, 30.0, 60.0).getErrorNorm()
-        self.assertAlmostEquals(0.0, error[0], delta=275.0)
-        self.assertAlmostEquals(0.0, error[1], delta=0.8)
+        self.assertAlmostEqual(0.0, error[0], delta=275.0)
+        self.assertAlmostEqual(0.0, error[1], delta=0.8)
 
 
     def testLaplaceKeplerian2(self):
@@ -165,14 +157,14 @@ class IodLaplaceTest(unittest.TestCase):
         date = AbsoluteDate(2019, 9, 29, 22, 0, 2.0, TimeScalesFactory.getUTC())
         kep = KeplerianOrbit(42165414.60406032, 0.00021743441091199163, 0.0019139259842569903,
     						      1.8142608912728584, 1.648821262690012,
-    						      0.11710513241172144, PositionAngle.MEAN, self.gcrf,
+    						      0.11710513241172144, PositionAngleType.MEAN, self.gcrf,
     						      date, Constants.EGM96_EARTH_MU)
 
         prop = KeplerianPropagator(kep)
 
         error = self.estimateOrbit(prop, date, 60.0, 120.0).getErrorNorm()
-        self.assertAlmostEquals(0.0, error[0], delta=395.0)
-        self.assertAlmostEquals(0.0, error[1], delta=0.03)
+        self.assertAlmostEqual(0.0, error[0], delta=395.0)
+        self.assertAlmostEqual(0.0, error[1], delta=0.03)
 
 
     def testLaplaceTLE1(self):
@@ -189,8 +181,8 @@ class IodLaplaceTest(unittest.TestCase):
 
         # With only 3 measurements, an error of 5km in position and 10 m/s in velocity is acceptable
         # because the Laplace method uses only two-body dynamics
-        self.assertAlmostEquals(0.0, error[0], delta=5000.0)
-        self.assertAlmostEquals(0.0, error[1], delta=10.0)
+        self.assertAlmostEqual(0.0, error[0], delta=5000.0)
+        self.assertAlmostEqual(0.0, error[1], delta=10.0)
 
 
 
diff --git a/python_files/test/KeplerianConverterTest.py b/python_files/test/KeplerianConverterTest.py
index c8d5d7d037dfff75c5ccfa4011f9389cb68180e3..ff1f9cb6ea97bab5e0c002135c76d6d1cf67d46e 100644
--- a/python_files/test/KeplerianConverterTest.py
+++ b/python_files/test/KeplerianConverterTest.py
@@ -34,7 +34,7 @@ from org.hipparchus.geometry.euclidean.threed import Vector3D
 from org.orekit.orbits import EquinoctialOrbit
 from org.orekit.orbits import Orbit
 from org.orekit.orbits import OrbitType
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.utils import PVCoordinates
 from org.orekit.propagation.conversion import FiniteDifferencePropagatorConverter
 from org.orekit.propagation.conversion import KeplerianPropagatorBuilder
@@ -67,7 +67,7 @@ class KeplerianConverterTest(unittest.TestCase):
         
 
         builder = KeplerianPropagatorBuilder(OrbitType.KEPLERIAN.convertType(orbit),
-                                                                   PositionAngle.MEAN,
+                                                                   PositionAngleType.MEAN,
                                                                    1.0)
 
         fitter = FiniteDifferencePropagatorConverter(builder, threshold, 1000)
diff --git a/python_files/test/KlobucharModelTest.py b/python_files/test/KlobucharModelTest.py
index e9147e46dab928d4bd97f3449be27edc3d922b32..3281eefb01dd3e6c6866a9ad49e014d4f71c479e 100644
--- a/python_files/test/KlobucharModelTest.py
+++ b/python_files/test/KlobucharModelTest.py
@@ -32,29 +32,15 @@ orekit.initVM()
 
 from orekit import JArray_double
 from org.orekit.data import DataProvidersManager, ZipJarCrawler, DataContext, DirectoryCrawler
-from org.orekit.propagation.integration import PythonFieldAdditionalEquations
-from org.orekit.forces.gravity.potential import GravityFieldFactory
-from org.orekit.forces.gravity.potential import SHMFormatReader
 from java.io import File
 from java.lang import System
 
 
-from org.hipparchus.geometry.euclidean.threed import Vector3D
-
-from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
-from org.hipparchus.ode.nonstiff import DormandPrince853FieldIntegrator
-
-from org.orekit.frames import FramesFactory
-from org.orekit.orbits import EquinoctialOrbit
-from org.orekit.orbits import OrbitType
-from org.orekit.propagation import SpacecraftState, FieldSpacecraftState
-from org.orekit.propagation.numerical import NumericalPropagator, FieldNumericalPropagator
-from org.orekit.propagation.semianalytical.dsst import DSSTPropagator
 from org.orekit.time import AbsoluteDate, FieldAbsoluteDate
 from org.orekit.utils import PVCoordinates
 from org.orekit.bodies import GeodeticPoint, FieldGeodeticPoint
 
-from org.hipparchus.util import MathArrays, Decimal64Field, FastMath, Precision
+from org.hipparchus.util import MathArrays, Binary64Field, FastMath, Precision
 
 from org.orekit.models.earth.ionosphere import KlobucharIonoModel, IonosphericModel
 
@@ -132,7 +118,7 @@ class KlobucharModelTest(unittest.TestCase):
         self.assertTrue(Precision.compareTo(delayMeters.getReal(), 0., self.epsilon) > 0)
 
     def testFieldDelay(self):
-        self.doTestFieldDelay(Decimal64Field.getInstance())
+        self.doTestFieldDelay(Binary64Field.getInstance())
 
 
 if __name__ == '__main__':
diff --git a/python_files/test/NodeDetectorTest.py b/python_files/test/NodeDetectorTest.py
index e1db903b55296c531ac3917ae50b9d7bd2585255..77c6f9c864c8a183a7c283cb0e8b2b441c766020 100644
--- a/python_files/test/NodeDetectorTest.py
+++ b/python_files/test/NodeDetectorTest.py
@@ -41,7 +41,7 @@ from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
 from org.hipparchus.util import FastMath
 from org.orekit.frames import FramesFactory
 from org.orekit.orbits import KeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation import SpacecraftState
 from org.orekit.propagation.events.handlers import ContinueOnEvent
 from org.orekit.propagation.numerical import NumericalPropagator
@@ -64,7 +64,7 @@ class NodeDetectorTest(unittest.TestCase):
         inertialFrame = FramesFactory.getEME2000()
         initialDate = AbsoluteDate(2014, 1, 1, 0, 0, 0.0, TimeScalesFactory.getUTC())
         finalDate = initialDate.shiftedBy(70 * 24 * 60 * 60.0)
-        initialOrbit = KeplerianOrbit(a, e, i, w, raan, v, PositionAngle.TRUE, inertialFrame, initialDate,
+        initialOrbit = KeplerianOrbit(a, e, i, w, raan, v, PositionAngleType.TRUE, inertialFrame, initialDate,
                                       Constants.WGS84_EARTH_MU)
         initialState = SpacecraftState(initialOrbit, 1000.0)
 
@@ -81,7 +81,7 @@ class NodeDetectorTest(unittest.TestCase):
         # Define 2 instances of NodeDetector:
         rawDetector = NodeDetector(1e-6,
                                    initialState.getOrbit(),
-                                   initialState.getFrame()).withHandler(ContinueOnEvent().of_(NodeDetector))
+                                   initialState.getFrame()).withHandler(ContinueOnEvent())
 
         logger1 = EventsLogger()
         node1 = logger1.monitorDetector(rawDetector)
diff --git a/python_files/test/OrekitStepHandlerTest.py b/python_files/test/OrekitStepHandlerTest.py
index a4ff2e53d1119def20243ed4c2097031135b1689..37a8e8ed2406c26de3f29035f620d84511430730 100644
--- a/python_files/test/OrekitStepHandlerTest.py
+++ b/python_files/test/OrekitStepHandlerTest.py
@@ -51,7 +51,7 @@ from org.orekit.frames import Frame
 from org.orekit.frames import FramesFactory
 from org.orekit.orbits import KeplerianOrbit
 from org.orekit.orbits import OrbitType
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation import Propagator
 from org.orekit.propagation import SpacecraftState
 from org.orekit.propagation.analytical import KeplerianPropagator
@@ -89,7 +89,7 @@ class OrekitStepHandlerTest(unittest.TestCase):
                                       inclination,
                                       argPerigee, raan,
                                       trueAnomaly,
-                                      PositionAngle.TRUE,
+                                      PositionAngleType.TRUE,
                                       inertialFrame,
                                       initialDate, mu)
 
@@ -133,7 +133,7 @@ class OrekitStepHandlerTest(unittest.TestCase):
         date = AbsoluteDate.J2000_EPOCH
         eci = FramesFactory.getGCRF()
         ic = SpacecraftState(KeplerianOrbit(6378137 + 500e3, 1e-3, 0.0, 0.0, 0.0, 0.0,
-                                            PositionAngle.TRUE, eci, date, Constants.EIGEN5C_EARTH_MU))
+                                            PositionAngleType.TRUE, eci, date, Constants.EIGEN5C_EARTH_MU))
         propagator.setInitialState(ic)
         propagator.setOrbitType(OrbitType.CARTESIAN)
         # detector triggers half way through second step
diff --git a/python_files/test/SmallManeuverAnalyticalModelTest.py b/python_files/test/SmallManeuverAnalyticalModelTest.py
index 605aae8181f89e568e39c36218849e90c700b243..f00041454db10bd2aa49ae26b225ab6db16939d2 100644
--- a/python_files/test/SmallManeuverAnalyticalModelTest.py
+++ b/python_files/test/SmallManeuverAnalyticalModelTest.py
@@ -34,6 +34,7 @@ from orekit import JArray_double, JArray
 from org.orekit.forces.maneuvers import SmallManeuverAnalyticalModel, ConstantThrustManeuver
 
 from org.hipparchus.geometry.euclidean.threed import Vector3D
+from org.hipparchus.geometry import Vector
 from org.hipparchus.ode.nonstiff import DormandPrince853Integrator
 from org.hipparchus.util import FastMath
 from org.orekit.utils import Constants
@@ -43,7 +44,7 @@ from org.orekit.frames import FramesFactory
 from org.orekit.frames import LOFType
 from org.orekit.orbits import CircularOrbit
 from org.orekit.orbits import KeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation import SpacecraftState, Propagator
 from org.orekit.propagation.numerical import NumericalPropagator
 from org.orekit.time import AbsoluteDate
@@ -64,7 +65,7 @@ class SmallManeuverAnalyticalModelTest(unittest.TestCase):
         leo = CircularOrbit(7200000.0, -1.0e-5, 2.0e-4,
                             radians(98.0),
                             radians(123.456),
-                            0.0, PositionAngle.MEAN,
+                            0.0, PositionAngleType.MEAN,
                             FramesFactory.getEME2000(),
                             AbsoluteDate(DateComponents(2004, 1, 1),
                                          TimeComponents(23, 30, 00.000),
@@ -107,7 +108,7 @@ class SmallManeuverAnalyticalModelTest(unittest.TestCase):
         leo = CircularOrbit(7200000.0, -1.0e-5, 2.0e-4,
                             radians(98.0),
                             radians(123.456),
-                            0.0, PositionAngle.MEAN,
+                            0.0, PositionAngleType.MEAN,
                             FramesFactory.getEME2000(),
                             AbsoluteDate(DateComponents(2004, 1, 1),
                                          TimeComponents(23, 30, 00.000),
@@ -149,7 +150,7 @@ class SmallManeuverAnalyticalModelTest(unittest.TestCase):
         heo = KeplerianOrbit(90000000.0, 0.92, FastMath.toRadians(98.0),
                              radians(12.3456),
                              radians(123.456),
-                             radians(1.23456), PositionAngle.MEAN,
+                             radians(1.23456), PositionAngleType.MEAN,
                              FramesFactory.getEME2000(),
                              AbsoluteDate(DateComponents(2004, 1, 1),
                                           TimeComponents(23, 30, 00.000),
@@ -210,7 +211,7 @@ class SmallManeuverAnalyticalModelTest(unittest.TestCase):
             # set up maneuver
             vExhaust = Constants.G0_STANDARD_GRAVITY * isp
             dt = -(mass * vExhaust / f) * FastMath.expm1(-dV.getNorm() / vExhaust)
-            maneuver = ConstantThrustManeuver(t0, dt, f, isp, dV.normalize())
+            maneuver = ConstantThrustManeuver(t0, dt, f, isp, Vector.cast_(dV).normalize())
             propagator.addForceModel(maneuver)
 
         generator = propagator.getEphemerisGenerator()
diff --git a/python_files/test/SpinStabilizedTest.py b/python_files/test/SpinStabilizedTest.py
index 4f479417a54c58fb7a34cf0eb3ccb83974692044..32fd6709453f165458d84f2924c52d12ef6004cb 100644
--- a/python_files/test/SpinStabilizedTest.py
+++ b/python_files/test/SpinStabilizedTest.py
@@ -35,14 +35,14 @@ from java.io import File
 
 from org.hipparchus.geometry.euclidean.threed import Rotation
 from org.hipparchus.geometry.euclidean.threed import Vector3D
-from org.hipparchus.util import Decimal64Field
+from org.hipparchus.util import Binary64Field
 from org.hipparchus.util import FastMath
 
 from org.orekit.bodies import CelestialBodyFactory
 
 from org.orekit.frames import FramesFactory
 from org.orekit.orbits import KeplerianOrbit
-from org.orekit.orbits import PositionAngle
+from org.orekit.orbits import PositionAngleType
 from org.orekit.propagation import FieldSpacecraftState
 from org.orekit.propagation import SpacecraftState
 from org.orekit.propagation.analytical import KeplerianPropagator
@@ -54,7 +54,7 @@ from org.orekit.time import TimeScalesFactory
 from org.orekit.utils import AngularCoordinates
 from org.orekit.utils import PVCoordinates
 from org.orekit.utils import PVCoordinatesProvider
-from org.orekit.attitudes import CelestialBodyPointed, SpinStabilized, InertialProvider
+from org.orekit.attitudes import CelestialBodyPointed, SpinStabilized, FrameAlignedProvider
 
 
 class SpinStabilizedTest(unittest.TestCase):
@@ -88,8 +88,7 @@ class SpinStabilizedTest(unittest.TestCase):
 
         attitude = bbq.getAttitude(kep, date, kep.getFrame())
 
-        # Decimal64Field is The field of double precision floating-point numbers
-        self.checkField(Decimal64Field.getInstance(), bbq, kep, kep.getDate(), kep.getFrame())
+        self.checkField(Binary64Field.getInstance(), bbq, kep, kep.getDate(), kep.getFrame())
 
         xDirection = attitude.getRotation().applyInverseTo(Vector3D.PLUS_I)
         sunpos = PVCoordinatesProvider.cast_(sun).getPVCoordinates(date, FramesFactory.getEME2000()).getPosition()
@@ -107,11 +106,11 @@ class SpinStabilizedTest(unittest.TestCase):
 
         rate = 2.0 * math.pi / (12 * 60)  # 12 minutes spin rate
 
-        law = SpinStabilized(InertialProvider(Rotation.IDENTITY), date, Vector3D.PLUS_K, rate)
+        law = SpinStabilized(FrameAlignedProvider(Rotation.IDENTITY), date, Vector3D.PLUS_K, rate)
 
         orbit = KeplerianOrbit(7178000.0, 1.e-4, FastMath.toRadians(50.),
                               FastMath.toRadians(10.), FastMath.toRadians(20.),
-                              FastMath.toRadians(30.), PositionAngle.MEAN,
+                              FastMath.toRadians(30.), PositionAngleType.MEAN,
                               FramesFactory.getEME2000(), date, 3.986004415e14)
 
         propagator = KeplerianPropagator(orbit, law)
diff --git a/python_files/test/TransformTest.py b/python_files/test/TransformTest.py
index a07ebb60a5f5ea9a4e0806e5138b628fdcd92e2a..3782d4db1dfc13aa7e3d94acb38169444ddc9fdc 100644
--- a/python_files/test/TransformTest.py
+++ b/python_files/test/TransformTest.py
@@ -42,7 +42,7 @@ from org.hipparchus.geometry.euclidean.threed import Vector3D
 from org.hipparchus.util import FastMath
 from org.orekit.utils import CartesianDerivativesFilter
 from org.orekit.utils import PVCoordinates
-from org.orekit.utils import TimeStampedPVCoordinates;
+from org.orekit.utils import TimeStampedPVCoordinates, TimeStampedPVCoordinatesHermiteInterpolator
 from org.orekit.frames import Transform
 from org.orekit.frames import FramesFactory
 
@@ -116,9 +116,9 @@ class TransformTest(unittest.TestCase):
                 sample.add(item)
                 i = i + 1
 
-            rebuiltPV = TimeStampedPVCoordinates.interpolate(AbsoluteDate.J2000_EPOCH.shiftedBy(dt),
-                                                             CartesianDerivativesFilter.USE_PV,
-                                                             sample)
+            interpolator = TimeStampedPVCoordinatesHermiteInterpolator(sample.size(), CartesianDerivativesFilter.USE_PV)
+
+            rebuiltPV = interpolator.interpolate(AbsoluteDate.J2000_EPOCH.shiftedBy(dt), sample)
 
             self.checkVector(rebuiltPV.getPosition(), transformedPV.getPosition(), 4.0e-16)
             self.checkVector(rebuiltPV.getVelocity(), transformedPV.getVelocity(), 2.0e-16)