Understanding basic motion calculations in games: Euler vs. Verlet

During the past month, I have found myself in the position of having to explain the contents of this article to six different persons, either at work or over the Internet. Though there are a lot of articles on the subject, it’s still as if almost everyone gets it wrong. I was still polishing this article when I had the opportunity to explain it a seventh time.

And two days ago a coworker told me the source code of a certain framework disagreed with me… The kind of framework that probably has three NDAs preventing me from even thinking about it.

Well that framework got it wrong, too. So now I’m mad at the entire world for no rational reason other than the ever occurring realisation of the amount of wrong out there, and this article is but a catharsis to deal with my uncontrollable rage.

A simple example

Imagine a particle with position Pos and velocity Vel affected by acceleration Accel. Let’s say for the moment that the acceleration is constant. This is the case when only gravity is present.

A typical game engine loop will update position with regards to a timestep (often the duration of a frame) using the following method, known as Euler integration:

Particle::Update(float dt)
    Accel = vec3(0, 0, -9.81); /* Constant acceleration: gravity */
    Vel = Vel + Accel * dt;    /* New, timestep-corrected velocity */
    Pos = Pos + Vel * dt;      /* New, timestep-corrected position */

This comes directly from the definition of acceleration:

\[a(t) = \frac{\mathrm{d}}{\mathrm{d}t}v(t)\]
\[v(t) = \frac{\mathrm{d}}{\mathrm{d}t}p(t)\]

Putting these two differential equations into Euler integration gives us the above code.

Measuring accuracy

Typical particle trajectories would look a bit like this:

These are three runs of the above simulation with the same initial values.

  • once with maximum accuracy,
  • once at 60 frames per second,
  • once at 30 frames per second.

You can notice the slight inaccuracy in the trajectories.

You may think…

“Oh, it could be worse; it’s just the expected inaccuracy with different framerate values.”

Well, no.

Just… no.

If you are updating positions this way and you do not have a really good reason for doing so then either you or the person who taught you is a fucking idiot and should not have been allowed to write so-called physics code in the first place and I most certainly hope to humbly bestow enlightenment upon you in the form of a massive cluebat and don’t you dare stop reading this sentence before I’m finished.

Why this is wrong

When doing kinematics, computing position from acceleration is an integration process. First you integrate acceleration with respect to time to get velocity, then you integrate velocity to get position.

\[v(t) = \int_0^t a(t)\,\mathrm{d}t\]
\[p(t) = \int_0^t v(t)\,\mathrm{d}t\]

The integral of a function can be seen as the area below its curve. So, how do you properly get the integral of our velocity between t and t + dt, ie. the green area below?

It’s not by doing new_velocity * dt (left image).

It’s not by doing old_velocity * dt either (middle image).

It’s obviously by doing (old_velocity + new_velocity) * 0.5 * dt (right image).

And now for the correct code

This is what the update method should look like. It’s called Velocity Verlet integration (not strictly the same as Verlet integration, but with a similar error order) and it always gives the perfect, exact position of the particle in the case of constant acceleration, even with the nastiest framerate you can think of. Even at two frames per second.

Particle::Update(float dt)
    Accel = vec3(0, 0, -9.81);
    vec3 OldVel = Vel;
    Vel = Vel + Accel * dt;
    Pos = Pos + (OldVel + Vel) * 0.5 * dt;

And the resulting trajectories at different framerates:

Further readings

“Oh wow thank you. But what if acceleration is not constant, like in real life?”

Well I am glad you asked.

Euler integration and Verlet integration are part of a family of iterative methods known as the Runge-Kutta methods, respectively of first order and second order. There are many more for you to discover and study.

  • Richard Lord did this nice and instructive animated presentation about several integration methods.
  • Glenn Fiedler also explains in this article why idiots use Euler, and provides a nice introduction to RK4 together with source code.
  • Florian Boesch did a thorough coverage of various integration methods for the specific application of gravitation (it is one of the rare cases where Euler seems to actually perform better).

In practice, Verlet will still only give you an approximation of your particle’s position. But it will almost always be a much better approximation than Euler. If you need even more accuracy, look at the fourth-order Runge-Kutta (RK4) method. Your physics will suck a lot less, I guarantee it.


I would like to thank everyone cited in this article, explicitly or implicitly, as well as the commenters below who spotted mistakes and provided corrections or improvements.

  • Posted: 2011-12-14 00:39 (Updated: 2011-12-15 14:34)
  • Author: sam
  • Categories: rant code physics

Attachments (5)

Download all attachments as: .zip


1. mikarnage -- 2011-12-14 15:47


Nice explanation, I would have liked to see the case about what happens with a spring+mass+friction system : from experience, rather than just a slight loss in precision, you can get into cases where the system gets unstable and explodes, rather than just slowly decreasing in amplitude..

2. sam -- 2011-12-14 16:07

@mikarnage: I would like to write another article about RK4 to illustrate that! Verlet would still help in comparison with Euler, but higher-level methods are really needed. The bane of RK4 is that it is so simple, yet so hard to explain. I hope to be able to get to-the-point diagrams like this one:

3. geolm -- 2011-12-14 18:32

"Your physics will suck a lot less, I guarantee it" true but the CPU cost is too high... that's why havok still use that dirty-euler-integration. Anyway nice article :)


4. Richard -- 2011-12-14 21:55

Hi Sam

The term "Verlet integration" is more commonly used to describe Störmer's original method, which improves stability in some situations (e.g. with springs) by completely avoiding the use of the velocity when calculating the position. The method you have called "Verlet" goes by many names, including "Velocity Verlet" and "Improved Euler", but to simply call it "Verlet" is not strictly correct. It is, as you say, much better than the standard Euler integration.

This presentation I did some years ago may be of interest, towards te end it compares the Euler integration (explicit and implicit) with the improved Euler (aka velocity Verlet), the 4th order Runge-Kutta and the Verlet (Störmer's original) in various circumstances.

5. Richard -- 2011-12-14 22:09

Hmm, the link to the presentation didn't work. And I can't add it now because trac thinks I'm spamming. Sorry.

Also, geolm, I last used Havok many years ago and even back then they offered the choice of Euler integrator, velocity Verlet integrator, and 4th order Runge-Kutta. The default was Euler, but the others were offered. What made it particularly flexible is you could chose to use the more accurate integrators on specific objects only.

6. Promit -- 2011-12-14 22:24

Sorry, but using Verlet or RK4 is not a good idea in a physical simulation. Neither integrator is good at preserving energy properly in the system, so you can get pretty severe instabilities as things explode or grind to a halt. For game simulation purposes, you're vastly better off with the semi-implicit Euler method.

7. anonymous -- 2011-12-15 11:34


Why is this true? is it mistake?

I thought a(t) = dv/dt; v(t) = dp/dt;

8. Valentin Simonov -- 2011-12-15 11:34

Err, about your definition of acceleration. v(t) = d p(t) / dt a(t) = d v(t) / dt

I wonder how nobody else noticed this.

9. sam -- 2011-12-15 12:15

@Valentin: that is indeed a mistake! I'm gonna fix that immediately, thanks.

10. sam -- 2011-12-15 12:21

@Richard: thank you for the suggestions, I will make it clearer that it is not strictly Verlet. And sorry for Trac's aggressive antispam behaviour: it gets pounded extremely hard by spambots so the Bayesian filter has become trigger-happy. I will put the link back in your comment. (I use this blog system because it lets me write maths and format source code very easily, but it's clearly not the nicest engine out there).

11. marco -- 2011-12-15 12:33

Lol, love that article. Extremely well presented, keep up (good work, humour, ...)!

12. mmick66@gmail.com -- 2012-04-27 20:22

Is this method of averaging velocities not identical with RK2?

13. sam -- 2012-04-28 13:15

@mmick66: you are right, when acceleration is constant, Velocity Verlet and RK2 become identical.

14. TheodorC -- 2013-01-07 16:36

Hi Sam,

I did, not a long time ago, a small survey on popular explicit integration methods. What I found in terms of terminology (unintended wordplay) was that your "Velocity Verlet" is actually the same as the "midpoint method". You can find some of these popular integrators mentioned in Appendix A of this paper -> https://www.dropbox.com/s/nfj4it6jjugfhdp/DLOReport.pdf . As I understood it, Velocity Verlet requires using a velocity prediction to find the future position, then correct/update the velocity to obtain a somewhat more synchronized pair (pos, vel). Thus, Velocity Verlet would evaluate the acceleration twice per step: the first time to get the position, then to get the corrected velocity using the updated position and the velocity prediction. Is this view correct, or have I misunderstood it badly?

As a sidenote, it might be worth mentioning some of the traits of symplectic integrators (such as Verlet): they preserve energy for closed systems (or area if you consider a parallelogram of initial conditions). RK4 is not symplectic, although being more accurate than Euler, it still introduces energy in the system and can make it explode. I don't have the links now, but there were some articles mentioning the possibility of making RK4 numerically damp the solution, thus having a somewhat more increased stability (and, of course, no symplicity whatsoever).

All in all, great articles/posts on numerical issues and C++, the community is grateful for you sharing this knowledge in such a concise and pertinent way!

Best wishes, Theodor

15. mcintyre321@gmail.com -- 2013-04-10 17:51

What about storing the position and time the acceleration was last changed, and doing the calculation from there?

Also, should Vel = Vel + (OldAccel + NewAccel) * 0.5 * dt; and if not, why not?


16. martijnhh -- 2013-10-20 12:53

Hi Sam,

I wish i found out about this article earlier.. The visual you presented made things a lot more clear to me! I'm currently trying to get an idea of what the difference is between integrators, but got stuck pretty quickly before stumbling on your article. I get things better when they're presented in a visual way or analogy instead of dry formula's.

As much as your picture cleared up the difference between euler and verlet for constant acceleration for me, I was hoping you could maybe clear a couple other things im not sure about..

You visualize how the area of the verlet integration function is given by: (old_velocity + new_velocity) * 0.5 * dt. So this works better than euler in this specific case, because for a constant acceleration, the graph between the old & new pos would be connected by a line and thus it's area can be perfectly fitted by a trapezoid. Is it safe to conclude that just like euler already has errors for constant acceleration, verlet will have errors just like euler when integrating non constant acceleration? And the error for Euler will even increase in comparison to verlet?

I also read that energy can get lost or is kept equal with some integrators, what does this exactly mean? Has it to do with these errors that add up or decrement during integration?

Is the example that Richard gives in the gravity example (one of the last slides) an example of RK4 not losing energy?: http://www.richardlord.net/presentations/physics-for-flash-games The verlet integrator seems to realisticly come at rest while the rk4 keeps going.. or was it not supposed to come at rest and was this because of "energy leaking" from the system?

And is the gravity example given here an example of errors adding up for verlet in non constant acceleration?: http://codeflow.org/entries/2010/aug/28/integration-by-example-euler-vs-verlet-vs-runge-kutta/ And why would it perform worse than euler here?

Also this "stability" they sometimes talk about (mostly when discussing springs), how is that related?



17. Aktau -- 2014-03-01 20:44

Your posted method is a degenerate version of velocity verlet (which I'm sure goes by several different names, all of which are confusing), in the case of constant acceleration. The one for the case where you have an acceleration() function (usually the case I guess) is this: http://en.wikipedia.org/wiki/Verlet_integration#Velocity_Verlet

The difference with your method is the velocity, where you just do forward Euler on the velocity, normally velocity Verlet averages the current acceleration and the acceleration of the predicted position. You can keep this acceleration around for the next invocation so you save actually evaluate the force function only once. You'll make a small error in case the acceleration function depends on velocity (drag forces, ...) as well, but hey, can't win 'em all.

As wikipedia says, some implementations even add another correction step, not sure how much it helps but it looks cheap (just one FMA-op).

18. plasmacel -- 2015-09-23 16:30

Verlet methods are not part of the Runge-Kutta family of methods. The 2nd order Runge-Kutta method is Heun's method (so-called Improved Euler), which is similar to the Velocity Verlet, yet different. Verlet methods are symplectic (they conserve energy), which can't be said about the Runge-Kutta family.

27. online -- 2016-12-15 11:49

http://v9onlinepharm.com/ , For Men Price In Bangalore in League City .

56. XRumerTest -- 2017-05-09 19:57

Hello. And Bye.

158. anonymous -- 2017-06-18 20:39


159. Ders3vchMub -- 2017-07-15 03:02

local payday loans <a href=http://www.europromec.com/index.php?option=com_k2&view=itemlist&task=user&id=62913>payday loans reviews</a> payday loan companies not brokers <a href="http://impanagiotopoulos.gr/index.php?option=com_k2&view=itemlist&task=user&id=2751"> fair credit loans</a> indian reservation loans <a href=http://www.cathaybabycare.com.tw/index.php?option=com_k2&view=itemlist&task=user&id=415698>easyloan</a> quick loans for people with bad credit <a href="http://tennis.krata.ru/index.php?option=com_k2&view=itemlist&task=user&id=215860"> unsecured loans for you</a> usa cash <a href=http://sparta-fit.com/index.php?option=com_k2&view=itemlist&task=user&id=577912>24 month loans</a> cash loans <a href="http://sov2009.ru/index.php?option=com_k2&view=itemlist&task=user&id=178473"> online loan application</a> cash advance online <a href=http://littlebearonline.com/index.php?option=com_k2&view=itemlist&task=user&id=14855>money lenders online</a> small personal loans for people with bad credit <a href="http://www.haicscale.com/index.php?option=com_k2&view=itemlist&task=user&id=551066"> loans for emergencies</a> get a loan fast <a href=http://tennis.krata.ru/index.php?option=com_k2&view=itemlist&task=user&id=215498>need money today</a> easy quick loans <a href="http://focusteam.ma/index.php?option=com_k2&view=itemlist&task=user&id=430823"> online payday lenders</a>

160. Cdfg2fvhTup -- 2017-07-15 03:02

transfer money to bank account <a href=http://bcel.uk/index.php?option=com_k2&view=itemlist&task=user&id=1043392>short term loan</a> payday loans spokane wa <a href="http://mobility-corp.com/index.php?option=com_k2&view=itemlist&task=user&id=989660"> bad credit payday loans direct lenders only</a> online personal loan application <a href=http://www.mykoperasi.coop/index.php?option=com_k2&view=itemlist&task=user&id=2731187>monthly payday loans</a> bank personal loans <a href="http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522381"> loan bad credit</a> banks that offer personal loans <a href=http://www.lala-nathi.co.za/index.php?option=com_k2&view=itemlist&task=user&id=666491>same day loans</a> payday loans albuquerque <a href="http://boreyk.ru/index.php?option=com_k2&view=itemlist&task=user&id=87940"> how to get a loan with bad credit</a> direct line loans <a href=http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522381>loan guarantee</a> secure loan <a href="http://by.soudalvps.safistudio.pl/index.php?option=com_k2&view=itemlist&task=user&id=488382"> express loan</a> holiday money <a href=http://avtobox.com.ua/index.php?option=com_k2&view=itemlist&task=user&id=8252>payday loan online direct lender</a> get personal loan <a href="http://www.stefantheimer.de/index.php?option=com_k2&view=itemlist&task=user&id=193066"> personal loan no credit</a>

161. Ders3vchMub -- 2017-07-15 08:20

payday cash advance online <a href=http://lpm-display-konzepte.de/index.php?option=com_k2&view=itemlist&task=user&id=1077870>payday cash advance</a> lenders for bad credit <a href="http://radiosaba.com/index.php?option=com_k2&view=itemlist&task=user&id=20946"> load finder</a> emergency loans for bad credit <a href=http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522381>sameday loans</a> online payday loans <a href="http://misericordiaaguiardabeira.pt/index.php?option=com_k2&view=itemlist&task=user&id=19885"> online loan companies</a> online loans in texas <a href=http://yubecosmetics.com/index.php?option=com_k2&view=itemlist&task=user&id=134864>direct lenders for bad credit loans</a> personal loan company <a href="http://alinaqijahani.ir/index.php?option=com_k2&view=itemlist&task=user&id=515632"> online payday loans</a> personal loans comparison <a href=http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522381>loan in minutes</a> i need 1000 dollars now <a href="http://verticalview.it/index.php?option=com_k2&view=itemlist&task=user&id=737106"> payday loans no debit card</a> payday loan lenders bad credit <a href=http://www.stefantheimer.de/index.php?option=com_k2&view=itemlist&task=user&id=193066>apply for personal loan</a> loans without credit checks <a href="http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522381"> same day cash loans</a>

162. Cdfg2fvhTup -- 2017-07-15 08:22

payday loan for bad credit <a href=http://www.bedanto.ir/index.php?option=com_k2&view=itemlist&task=user&id=182441>actual payday lenders</a> no credit personal loans <a href="http://www.slinardos.gr/index.php?option=com_k2&view=itemlist&task=user&id=258921"> money lending sites</a> lenders network <a href=http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522814>borrowing money</a> loans for bad credit not payday loans <a href="http://www.greenacre.co.za/index.php?option=com_k2&view=itemlist&task=user&id=1806439"> check advance</a> personal bad credit loans <a href=http://www.greenacre.co.za/index.php?option=com_k2&view=itemlist&task=user&id=1807093>i need a loan with bad credit</a> high interest loans <a href="http://mobility-corp.com/index.php?option=com_k2&view=itemlist&task=user&id=990286"> non broker payday loans</a> direct payday lenders for bad credit <a href=http://yellowdevilz.com/index.php?option=com_k2&view=itemlist&task=user&id=485659>payday cash advance online</a> direct cash <a href="http://mobility-corp.com/index.php?option=com_k2&view=itemlist&task=user&id=989660"> how can i get money today</a> loan options <a href=http://hoasupportgroup.com/index.php?option=com_k2&view=itemlist&task=user&id=577448>online loans</a> payday loans las vegas nv <a href="http://spyroltd.com/index.php?option=com_k2&view=itemlist&task=user&id=997059"> online payday loans bc</a>

163. Cdfg2fvhTup -- 2017-07-15 16:21

i need a loan with bad credit <a href=http://speroda.org/index.php?option=com_k2&view=itemlist&task=user&id=6121>loansdirect</a> greenwood loans <a href="http://www.nds.com.pk/index.php?option=com_k2&view=itemlist&task=user&id=440436"> ez money loan</a> net pay advance <a href=http://www.selimiyecamii.nl/index.php?option=com_k2&view=itemlist&task=user&id=114168>loans in houston</a> direct cash lenders <a href="http://pasyvex.com/index.php?option=com_k2&view=itemlist&task=user&id=14865"> loans online bad credit</a> online lenders <a href=http://tennis.krata.ru/index.php?option=com_k2&view=itemlist&task=user&id=215860>bad credit personal loans for 5000</a> payday loans online direct lenders only <a href="http://www.nds.com.pk/index.php?option=com_k2&view=itemlist&task=user&id=440236"> payadvance</a> payday loans el paso tx <a href=http://autocaravanastenerife.es/index.php?option=com_k2&view=itemlist&task=user&id=93800>online personal loans</a> quick pay day loans <a href="http://afina-mos.ru/index.php?option=com_k2&view=itemlist&task=user&id=270356"> online cash</a> short term personal loans <a href=http://verticearq.com.mx/index.php?option=com_k2&view=itemlist&task=user&id=583022>how to apply for a personal loan</a> payday advance locations <a href="http://www.yopougon.ci/index.php?option=com_k2&view=itemlist&task=user&id=522381"> loan express</a>

164. Maria6ennvop -- 2017-07-15 23:15

online loans <a href=http://payday100loans3000online.com/>online loans</a> payday loan <a href="http://payday100loans3000online.com/"> loans online</a>

165. Dvur5fbhnip -- 2017-07-16 04:18

loan providers <a href=http://www.rcprofessionista.net/index.php?option=com_k2&view=itemlist&task=user&id=94839>personal loans for people with poor credit</a> online payday loans in texas <a href="http://pasyvex.com/index.php?option=com_k2&view=itemlist&task=user&id=14865"> fast cash now</a> advance loan <a href=http://sov2009.ru/index.php?option=com_k2&view=itemlist&task=user&id=178732>loan services</a> get a loan <a href="http://laprincesadeljamon.com/index.php?option=com_k2&view=itemlist&task=user&id=33205"> quick loans same day</a> bad credit loans online <a href=http://testserver7.amcomplete.com/index.php?option=com_k2&view=itemlist&task=user&id=132497>tax advance loans</a> quick personal loan <a href="http://argillic.com/index.php?option=com_k2&view=itemlist&task=user&id=961732"> online payday loans california</a> bad credit loans reviews <a href=http://psmbranding.com/index.php?option=com_k2&view=itemlist&task=user&id=653853>very bad credit loans</a> payday loan reviews <a href="http://hoasupportgroup.com/index.php?option=com_k2&view=itemlist&task=user&id=577822"> paydayloan com</a> emergency bad credit loans <a href=http://mobility-corp.com/index.php?option=com_k2&view=itemlist&task=user&id=990687>bad credit payday loan lenders</a> bad credit loans california <a href="http://ingespek.nl/index.php?option=com_k2&view=itemlist&task=user&id=20060"> direct payday loan lenders online</a>

167. Merlinbib -- 2017-08-19 10:18

<a href=http://www.acgproducciones.es/zapatos-hugo-boss-sport-625.html>Zapatos Hugo Boss Sport</a>

With so many contaminants within the oxygen, it may be challenging to identify by far the most probable cause for your sensitive symptoms. A lot of people just imagine that plant pollen is to pin the blame on. In fact, it could be everything from lawn fertilizer, to local animals, and natural plants and flowers. In such cases, you can easily come to be disheartened when 1 experiences a hypersensitive reaction even in the course of days and nights by using a very low pollen count up. An allergies analyze will help you to reach the base of your signs and symptoms.

<img>https://www.ttwater.it/images/creepers/3627-puma-creepers-mimetiche.jpg</img> Golf is performed all around the world and is probably the number of online games that lacks a standard area of engage in. Playing golf programs can differ broadly from location to location however most have possibly 9 or 18 pockets. Golf is a very social sports activity and is known as a discretion activity.Excellent Advice For Maximizing Your Weight Damage <img>https://www.gartex.it/images/gartex/12513-asics-gel-kayano-8.jpg</img>

169. Sarah Carlson -- 2017-08-20 13:46

This is a comment to the Blog: Understanding basic motion calculations in games: Euler vs. Verlet – Lol Engine webmaster. Your website is missing out on at least 300 visitors per day. Our traffic system will dramatically increase your traffic to your site: https://flxv.tk/6 - We offer 500 free targeted visitors during our free trial period and we offer up to 30,000 targeted visitors per month. Hope this helps :) Unsubscribe here: http://priscilarodrigues.com.br/url/11

170. James Kelly -- 2017-11-16 06:44

OH. MY. GOD. I was having the hardest time figuring out why my sprite was oscillating in my 2D project with it getting seemingly worse the more the sprite moved and I was ready to give up until I came across your article and my face when all the jitter was gone with just a single change in a line of code.

Thank you so much!

171. RD -- 2017-12-08 09:45

Neither of the two method you described are false or wrong. The first one is simply called semi-implicit Euler method. There are plenty of scenarios where semi-implicit Euler is fast and accurate enough and at the same time uses less calculations and memory. Particle systems as an example. If you have thousands of particle update per game loop cycle, have slightly less calculations might make a difference and at the same time, a perfect position of the particles is irrelevant and is hardly noticeable.

As you have mentioned, your method produces correct results only if acceleration is constant, which is hardly ever the case.

Maybe you should watch you language and be more careful about who you call a "fucking idiot" or others might judge upon you in the same way.

172. dissertation helpers -- 2018-01-11 07:32

Well thanks for posting such an outstanding idea. I like this blog & I like the topic and thinking of making it right. <a href="https://www.dissertationinc.com/">dissertation helpers</a>

173. Law Project Help -- 2018-01-11 11:31

We also share some information about our business https://lawassignmentshelp.com/

174. kaalus -- 2018-01-22 22:34

Accuracy is often less important than stability. The method you are proposing (midpoint) while more accurate, is less stable than plain Euler. You will be able to sustain stiffer forces without your system exploding by using plain Euler.

175. anonymous -- 2018-02-19 10:20

Thank you for your work on the blog! You're doing a good job! I would like to read about it anymore. Prompt, what literature to study?


176. anonymous -- 2018-07-16 18:19

Wegmans Food Markets is a privately held American supermarket chain. It employs thousands of people throughout their many store locations. Wegmans employees use an employee portal named https://mywegmansconnectt.xyz/www-mywegmansconnect-com/ Employee portal so that they can get every news from the company.

Add New Comment