diff --git a/CHANGELOG.md b/CHANGELOG.md
index 34cbc30e7a2f7321d1aacbeb23f0ef0505817e1c..dc512e0ef8187677788fc7ddc9d55901096722a7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,7 @@
 Requires `libfranka` >= 0.3.0
 
   * **BREAKING** Changed signatures in `franka_hw::FrankaModelHandle`
+  * **BREAKING** Added epsilon parameters to `franka_gripper/Grasp` action
   * Added missing dependency to `panda_moveit_config`
   * Fixed linker errors when building with `-DFranka_DIR` while an older version of
     `ros-kinetic-libfranka` is installed
diff --git a/franka_gripper/CMakeLists.txt b/franka_gripper/CMakeLists.txt
index bdec2005a489b1c85b8d93f79c3e1f12576932b2..3055ed44345a2076f91a81539141148d1253892b 100644
--- a/franka_gripper/CMakeLists.txt
+++ b/franka_gripper/CMakeLists.txt
@@ -24,6 +24,11 @@ add_action_files(
         Move.action
 )
 
+add_message_files(
+  DIRECTORY msg
+  FILES GraspEpsilon.msg
+)
+
 generate_messages(DEPENDENCIES actionlib_msgs)
 
 catkin_package(
diff --git a/franka_gripper/action/Grasp.action b/franka_gripper/action/Grasp.action
index 97fa8320b9378b93c372611a3ae236ac2079fa81..a02b952721533ea4fadc9a0df65789f1068cb5b5 100644
--- a/franka_gripper/action/Grasp.action
+++ b/franka_gripper/action/Grasp.action
@@ -1,4 +1,5 @@
 float64 width    # [m]
+GraspEpsilon epsilon
 float64 speed    # [m/s]
 float64 force  # [N]
 ---
diff --git a/franka_gripper/config/gripper_node_config.yaml b/franka_gripper/config/gripper_node_config.yaml
index f7546fd098747578a034b6cce24ce39469a4b146..8799cbd639f4716f07d550162945c3a3bda08d7e 100644
--- a/franka_gripper/config/gripper_node_config.yaml
+++ b/franka_gripper/config/gripper_node_config.yaml
@@ -3,3 +3,6 @@ joint_names:
   - panda_finger_joint1
   - panda_finger_joint2
 default_speed: 0.1  # [m/s]
+default_grasp_epsilon:
+  inner: 0.005 # [m]
+  outer: 0.005 # [m]
\ No newline at end of file
diff --git a/franka_gripper/include/franka_gripper/franka_gripper.h b/franka_gripper/include/franka_gripper/franka_gripper.h
index 5b9d0b16ba24fe1a30a2c9f5dd20bef2b2091937..6828577e497d2b5a7e7ab668cd8ef559c9839592 100644
--- a/franka_gripper/include/franka_gripper/franka_gripper.h
+++ b/franka_gripper/include/franka_gripper/franka_gripper.h
@@ -35,11 +35,13 @@ bool updateGripperState(const franka::Gripper& gripper, franka::GripperState* st
  *
  * @param[in] gripper A pointer to a franka gripper
  * @param[in] default_speed The default speed for a gripper action
+ * @param[in] grasp_epsilon The epsilon window of the grasp.
  * @param[in] action_server A pointer to a gripper action server
  * @param[in] goal A gripper action goal
  */
 void gripperCommandExecuteCallback(
     const franka::Gripper& gripper,
+    const GraspEpsilon& grasp_epsilon,
     double default_speed,
     actionlib::SimpleActionServer<control_msgs::GripperCommandAction>* action_server,
     const control_msgs::GripperCommandGoalConstPtr& goal);
@@ -75,9 +77,11 @@ bool stop(const franka::Gripper& gripper, const StopGoalConstPtr& /*goal*/);
 /**
  * Calls the libfranka grasp service of the gripper
  *
- * @param[in] gripper A gripper instance to execute the command
- * @param[in] goal A grasp goal with target width, velocity and effort
+ * An object is considered grasped if the distance \f$d\f$ between the gripper fingers satisfies
+ * \f$(\text{width} - \text{epsilon_inner}) < d < (\text{width} + \text{epsilon_outer})\f$.
  *
+ * @param[in] gripper A gripper instance to execute the command
+ * @param[in] goal A grasp goal with target width, epsilon_inner, epsilon_outer, velocity and effort
  * @return True if an object has been grasped, false otherwise.
  */
 bool grasp(const franka::Gripper& gripper, const GraspGoalConstPtr& goal);
diff --git a/franka_gripper/msg/GraspEpsilon.msg b/franka_gripper/msg/GraspEpsilon.msg
new file mode 100644
index 0000000000000000000000000000000000000000..b750cf6d50ffc0e2d9035249070284e905e8c21b
--- /dev/null
+++ b/franka_gripper/msg/GraspEpsilon.msg
@@ -0,0 +1,2 @@
+float64 inner # [m]
+float64 outer # [m]
diff --git a/franka_gripper/src/franka_gripper.cpp b/franka_gripper/src/franka_gripper.cpp
index 5f7ffc66a0fc68e26ce9820bbafc523bcf823e43..a58493dc880d3e608dc1a50870c44df36e954e2c 100644
--- a/franka_gripper/src/franka_gripper.cpp
+++ b/franka_gripper/src/franka_gripper.cpp
@@ -29,6 +29,7 @@ bool updateGripperState(const franka::Gripper& gripper, franka::GripperState* st
 
 void gripperCommandExecuteCallback(
     const franka::Gripper& gripper,
+    const GraspEpsilon& grasp_epsilon,
     double default_speed,
     actionlib::SimpleActionServer<control_msgs::GripperCommandAction>* action_server,
     const control_msgs::GripperCommandGoalConstPtr& goal) {
@@ -42,7 +43,8 @@ void gripperCommandExecuteCallback(
     if (goal->command.position >= state.width) {
       return gripper.move(goal->command.position, default_speed);
     }
-    return gripper.grasp(goal->command.position, default_speed, goal->command.max_effort);
+    return gripper.grasp(goal->command.position, default_speed, goal->command.max_effort,
+                         grasp_epsilon.inner, grasp_epsilon.outer);
   };
 
   try {
@@ -77,7 +79,8 @@ bool stop(const franka::Gripper& gripper, const StopGoalConstPtr& /*goal*/) {
 }
 
 bool grasp(const franka::Gripper& gripper, const GraspGoalConstPtr& goal) {
-  return gripper.grasp(goal->width, goal->speed, goal->force);
+  return gripper.grasp(goal->width, goal->speed, goal->force, goal->epsilon.inner,
+                       goal->epsilon.outer);
 }
 
 }  // namespace franka_gripper
diff --git a/franka_gripper/src/franka_gripper_node.cpp b/franka_gripper/src/franka_gripper_node.cpp
index 31ed7c265f28b01a904d8fb715ad3105dbda6383..8b5b5eaeeab8a2e39c67d0b8e0d2623f5267f66c 100644
--- a/franka_gripper/src/franka_gripper_node.cpp
+++ b/franka_gripper/src/franka_gripper_node.cpp
@@ -38,6 +38,7 @@ void handleErrors(actionlib::SimpleActionServer<T_action>* server,
 using actionlib::SimpleActionServer;
 using control_msgs::GripperCommandAction;
 using franka_gripper::GraspAction;
+using franka_gripper::GraspEpsilon;
 using franka_gripper::GraspGoalConstPtr;
 using franka_gripper::GraspResult;
 using franka_gripper::HomingAction;
@@ -70,6 +71,17 @@ int main(int argc, char** argv) {
     ROS_INFO_STREAM("franka_gripper_node: Found default_speed " << default_speed);
   }
 
+  GraspEpsilon default_grasp_epsilon;
+  default_grasp_epsilon.inner = 0.005;
+  default_grasp_epsilon.outer = 0.005;
+  std::map<std::string, double> epsilon_map;
+  if (node_handle.getParam("default_grasp_epsilon", epsilon_map)) {
+    ROS_INFO_STREAM("franka_gripper_node: Found default_grasp_epsilon "
+                    << "inner: " << epsilon_map["inner"] << ", outer: " << epsilon_map["outer"]);
+    default_grasp_epsilon.inner = epsilon_map["inner"];
+    default_grasp_epsilon.outer = epsilon_map["outer"];
+  }
+
   franka::Gripper gripper(robot_ip);
 
   std::function<bool(const HomingGoalConstPtr&)> homing_handler =
@@ -104,8 +116,8 @@ int main(int argc, char** argv) {
 
   SimpleActionServer<GripperCommandAction> gripper_command_action_server(
       node_handle, "gripper_action",
-      std::bind(&gripperCommandExecuteCallback, std::cref(gripper), default_speed,
-                &gripper_command_action_server, std::placeholders::_1),
+      std::bind(&gripperCommandExecuteCallback, std::cref(gripper), default_grasp_epsilon,
+                default_speed, &gripper_command_action_server, std::placeholders::_1),
       false);
 
   homing_action_server_.start();