diff --git a/lightning.pb-c.c b/lightning.pb-c.c
index 4233929d4..e1bebac80 100644
--- a/lightning.pb-c.c
+++ b/lightning.pb-c.c
@@ -394,6 +394,178 @@ void   update__free_unpacked
   assert(message->base.descriptor == &update__descriptor);
   protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
 }
+void   update_add_htlc__init
+                     (UpdateAddHtlc         *message)
+{
+  static UpdateAddHtlc init_value = UPDATE_ADD_HTLC__INIT;
+  *message = init_value;
+}
+size_t update_add_htlc__get_packed_size
+                     (const UpdateAddHtlc *message)
+{
+  assert(message->base.descriptor == &update_add_htlc__descriptor);
+  return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
+}
+size_t update_add_htlc__pack
+                     (const UpdateAddHtlc *message,
+                      uint8_t       *out)
+{
+  assert(message->base.descriptor == &update_add_htlc__descriptor);
+  return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
+}
+size_t update_add_htlc__pack_to_buffer
+                     (const UpdateAddHtlc *message,
+                      ProtobufCBuffer *buffer)
+{
+  assert(message->base.descriptor == &update_add_htlc__descriptor);
+  return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
+}
+UpdateAddHtlc *
+       update_add_htlc__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data)
+{
+  return (UpdateAddHtlc *)
+     protobuf_c_message_unpack (&update_add_htlc__descriptor,
+                                allocator, len, data);
+}
+void   update_add_htlc__free_unpacked
+                     (UpdateAddHtlc *message,
+                      ProtobufCAllocator *allocator)
+{
+  assert(message->base.descriptor == &update_add_htlc__descriptor);
+  protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
+}
+void   update_complete_htlc__init
+                     (UpdateCompleteHtlc         *message)
+{
+  static UpdateCompleteHtlc init_value = UPDATE_COMPLETE_HTLC__INIT;
+  *message = init_value;
+}
+size_t update_complete_htlc__get_packed_size
+                     (const UpdateCompleteHtlc *message)
+{
+  assert(message->base.descriptor == &update_complete_htlc__descriptor);
+  return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
+}
+size_t update_complete_htlc__pack
+                     (const UpdateCompleteHtlc *message,
+                      uint8_t       *out)
+{
+  assert(message->base.descriptor == &update_complete_htlc__descriptor);
+  return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
+}
+size_t update_complete_htlc__pack_to_buffer
+                     (const UpdateCompleteHtlc *message,
+                      ProtobufCBuffer *buffer)
+{
+  assert(message->base.descriptor == &update_complete_htlc__descriptor);
+  return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
+}
+UpdateCompleteHtlc *
+       update_complete_htlc__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data)
+{
+  return (UpdateCompleteHtlc *)
+     protobuf_c_message_unpack (&update_complete_htlc__descriptor,
+                                allocator, len, data);
+}
+void   update_complete_htlc__free_unpacked
+                     (UpdateCompleteHtlc *message,
+                      ProtobufCAllocator *allocator)
+{
+  assert(message->base.descriptor == &update_complete_htlc__descriptor);
+  protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
+}
+void   update_remove_htlc__init
+                     (UpdateRemoveHtlc         *message)
+{
+  static UpdateRemoveHtlc init_value = UPDATE_REMOVE_HTLC__INIT;
+  *message = init_value;
+}
+size_t update_remove_htlc__get_packed_size
+                     (const UpdateRemoveHtlc *message)
+{
+  assert(message->base.descriptor == &update_remove_htlc__descriptor);
+  return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
+}
+size_t update_remove_htlc__pack
+                     (const UpdateRemoveHtlc *message,
+                      uint8_t       *out)
+{
+  assert(message->base.descriptor == &update_remove_htlc__descriptor);
+  return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
+}
+size_t update_remove_htlc__pack_to_buffer
+                     (const UpdateRemoveHtlc *message,
+                      ProtobufCBuffer *buffer)
+{
+  assert(message->base.descriptor == &update_remove_htlc__descriptor);
+  return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
+}
+UpdateRemoveHtlc *
+       update_remove_htlc__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data)
+{
+  return (UpdateRemoveHtlc *)
+     protobuf_c_message_unpack (&update_remove_htlc__descriptor,
+                                allocator, len, data);
+}
+void   update_remove_htlc__free_unpacked
+                     (UpdateRemoveHtlc *message,
+                      ProtobufCAllocator *allocator)
+{
+  assert(message->base.descriptor == &update_remove_htlc__descriptor);
+  protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
+}
+void   update_remove_htlc_delay__init
+                     (UpdateRemoveHtlcDelay         *message)
+{
+  static UpdateRemoveHtlcDelay init_value = UPDATE_REMOVE_HTLC_DELAY__INIT;
+  *message = init_value;
+}
+size_t update_remove_htlc_delay__get_packed_size
+                     (const UpdateRemoveHtlcDelay *message)
+{
+  assert(message->base.descriptor == &update_remove_htlc_delay__descriptor);
+  return protobuf_c_message_get_packed_size ((const ProtobufCMessage*)(message));
+}
+size_t update_remove_htlc_delay__pack
+                     (const UpdateRemoveHtlcDelay *message,
+                      uint8_t       *out)
+{
+  assert(message->base.descriptor == &update_remove_htlc_delay__descriptor);
+  return protobuf_c_message_pack ((const ProtobufCMessage*)message, out);
+}
+size_t update_remove_htlc_delay__pack_to_buffer
+                     (const UpdateRemoveHtlcDelay *message,
+                      ProtobufCBuffer *buffer)
+{
+  assert(message->base.descriptor == &update_remove_htlc_delay__descriptor);
+  return protobuf_c_message_pack_to_buffer ((const ProtobufCMessage*)message, buffer);
+}
+UpdateRemoveHtlcDelay *
+       update_remove_htlc_delay__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data)
+{
+  return (UpdateRemoveHtlcDelay *)
+     protobuf_c_message_unpack (&update_remove_htlc_delay__descriptor,
+                                allocator, len, data);
+}
+void   update_remove_htlc_delay__free_unpacked
+                     (UpdateRemoveHtlcDelay *message,
+                      ProtobufCAllocator *allocator)
+{
+  assert(message->base.descriptor == &update_remove_htlc_delay__descriptor);
+  protobuf_c_message_free_unpacked ((ProtobufCMessage*)message, allocator);
+}
 void   update_accept__init
                      (UpdateAccept         *message)
 {
@@ -1340,6 +1512,225 @@ const ProtobufCMessageDescriptor update__descriptor =
   (ProtobufCMessageInit) update__init,
   NULL,NULL,NULL    /* reserved[123] */
 };
+static const ProtobufCFieldDescriptor update_add_htlc__field_descriptors[4] =
+{
+  {
+    "revocation_hash",
+    1,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateAddHtlc, revocation_hash),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "amount",
+    2,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_UINT64,
+    0,   /* quantifier_offset */
+    offsetof(UpdateAddHtlc, amount),
+    NULL,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "r_hash",
+    3,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateAddHtlc, r_hash),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "locktime",
+    4,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateAddHtlc, locktime),
+    &locktime__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+};
+static const unsigned update_add_htlc__field_indices_by_name[] = {
+  1,   /* field[1] = amount */
+  3,   /* field[3] = locktime */
+  2,   /* field[2] = r_hash */
+  0,   /* field[0] = revocation_hash */
+};
+static const ProtobufCIntRange update_add_htlc__number_ranges[1 + 1] =
+{
+  { 1, 0 },
+  { 0, 4 }
+};
+const ProtobufCMessageDescriptor update_add_htlc__descriptor =
+{
+  PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
+  "update_add_htlc",
+  "UpdateAddHtlc",
+  "UpdateAddHtlc",
+  "",
+  sizeof(UpdateAddHtlc),
+  4,
+  update_add_htlc__field_descriptors,
+  update_add_htlc__field_indices_by_name,
+  1,  update_add_htlc__number_ranges,
+  (ProtobufCMessageInit) update_add_htlc__init,
+  NULL,NULL,NULL    /* reserved[123] */
+};
+static const ProtobufCFieldDescriptor update_complete_htlc__field_descriptors[2] =
+{
+  {
+    "revocation_hash",
+    1,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateCompleteHtlc, revocation_hash),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "r",
+    3,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateCompleteHtlc, r),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+};
+static const unsigned update_complete_htlc__field_indices_by_name[] = {
+  1,   /* field[1] = r */
+  0,   /* field[0] = revocation_hash */
+};
+static const ProtobufCIntRange update_complete_htlc__number_ranges[2 + 1] =
+{
+  { 1, 0 },
+  { 3, 1 },
+  { 0, 2 }
+};
+const ProtobufCMessageDescriptor update_complete_htlc__descriptor =
+{
+  PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
+  "update_complete_htlc",
+  "UpdateCompleteHtlc",
+  "UpdateCompleteHtlc",
+  "",
+  sizeof(UpdateCompleteHtlc),
+  2,
+  update_complete_htlc__field_descriptors,
+  update_complete_htlc__field_indices_by_name,
+  2,  update_complete_htlc__number_ranges,
+  (ProtobufCMessageInit) update_complete_htlc__init,
+  NULL,NULL,NULL    /* reserved[123] */
+};
+static const ProtobufCFieldDescriptor update_remove_htlc__field_descriptors[2] =
+{
+  {
+    "revocation_hash",
+    1,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateRemoveHtlc, revocation_hash),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "r_hash",
+    3,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateRemoveHtlc, r_hash),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+};
+static const unsigned update_remove_htlc__field_indices_by_name[] = {
+  1,   /* field[1] = r_hash */
+  0,   /* field[0] = revocation_hash */
+};
+static const ProtobufCIntRange update_remove_htlc__number_ranges[2 + 1] =
+{
+  { 1, 0 },
+  { 3, 1 },
+  { 0, 2 }
+};
+const ProtobufCMessageDescriptor update_remove_htlc__descriptor =
+{
+  PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
+  "update_remove_htlc",
+  "UpdateRemoveHtlc",
+  "UpdateRemoveHtlc",
+  "",
+  sizeof(UpdateRemoveHtlc),
+  2,
+  update_remove_htlc__field_descriptors,
+  update_remove_htlc__field_indices_by_name,
+  2,  update_remove_htlc__number_ranges,
+  (ProtobufCMessageInit) update_remove_htlc__init,
+  NULL,NULL,NULL    /* reserved[123] */
+};
+static const ProtobufCFieldDescriptor update_remove_htlc_delay__field_descriptors[1] =
+{
+  {
+    "r_hash",
+    1,
+    PROTOBUF_C_LABEL_REQUIRED,
+    PROTOBUF_C_TYPE_MESSAGE,
+    0,   /* quantifier_offset */
+    offsetof(UpdateRemoveHtlcDelay, r_hash),
+    &sha256_hash__descriptor,
+    NULL,
+    0,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+};
+static const unsigned update_remove_htlc_delay__field_indices_by_name[] = {
+  0,   /* field[0] = r_hash */
+};
+static const ProtobufCIntRange update_remove_htlc_delay__number_ranges[1 + 1] =
+{
+  { 1, 0 },
+  { 0, 1 }
+};
+const ProtobufCMessageDescriptor update_remove_htlc_delay__descriptor =
+{
+  PROTOBUF_C__MESSAGE_DESCRIPTOR_MAGIC,
+  "update_remove_htlc_delay",
+  "UpdateRemoveHtlcDelay",
+  "UpdateRemoveHtlcDelay",
+  "",
+  sizeof(UpdateRemoveHtlcDelay),
+  1,
+  update_remove_htlc_delay__field_descriptors,
+  update_remove_htlc_delay__field_indices_by_name,
+  1,  update_remove_htlc_delay__number_ranges,
+  (ProtobufCMessageInit) update_remove_htlc_delay__init,
+  NULL,NULL,NULL    /* reserved[123] */
+};
 static const ProtobufCFieldDescriptor update_accept__field_descriptors[2] =
 {
   {
@@ -1608,7 +1999,7 @@ const ProtobufCMessageDescriptor error__descriptor =
   (ProtobufCMessageInit) error__init,
   NULL,NULL,NULL    /* reserved[123] */
 };
-static const ProtobufCFieldDescriptor pkt__field_descriptors[11] =
+static const ProtobufCFieldDescriptor pkt__field_descriptors[15] =
 {
   {
     "update",
@@ -1623,11 +2014,23 @@ static const ProtobufCFieldDescriptor pkt__field_descriptors[11] =
     0,NULL,NULL    /* reserved1,reserved2, etc */
   },
   {
-    "update_accept",
+    "update_add_htlc",
     2,
     PROTOBUF_C_LABEL_OPTIONAL,
     PROTOBUF_C_TYPE_MESSAGE,
     offsetof(Pkt, pkt_case),
+    offsetof(Pkt, update_add_htlc),
+    &update_add_htlc__descriptor,
+    NULL,
+    0 | PROTOBUF_C_FIELD_FLAG_ONEOF,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "update_accept",
+    3,
+    PROTOBUF_C_LABEL_OPTIONAL,
+    PROTOBUF_C_TYPE_MESSAGE,
+    offsetof(Pkt, pkt_case),
     offsetof(Pkt, update_accept),
     &update_accept__descriptor,
     NULL,
@@ -1636,7 +2039,7 @@ static const ProtobufCFieldDescriptor pkt__field_descriptors[11] =
   },
   {
     "update_signature",
-    3,
+    4,
     PROTOBUF_C_LABEL_OPTIONAL,
     PROTOBUF_C_TYPE_MESSAGE,
     offsetof(Pkt, pkt_case),
@@ -1648,7 +2051,7 @@ static const ProtobufCFieldDescriptor pkt__field_descriptors[11] =
   },
   {
     "update_complete",
-    4,
+    5,
     PROTOBUF_C_LABEL_OPTIONAL,
     PROTOBUF_C_TYPE_MESSAGE,
     offsetof(Pkt, pkt_case),
@@ -1658,6 +2061,42 @@ static const ProtobufCFieldDescriptor pkt__field_descriptors[11] =
     0 | PROTOBUF_C_FIELD_FLAG_ONEOF,             /* flags */
     0,NULL,NULL    /* reserved1,reserved2, etc */
   },
+  {
+    "update_complete_htlc",
+    6,
+    PROTOBUF_C_LABEL_OPTIONAL,
+    PROTOBUF_C_TYPE_MESSAGE,
+    offsetof(Pkt, pkt_case),
+    offsetof(Pkt, update_complete_htlc),
+    &update_complete_htlc__descriptor,
+    NULL,
+    0 | PROTOBUF_C_FIELD_FLAG_ONEOF,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "update_remove_htlc",
+    7,
+    PROTOBUF_C_LABEL_OPTIONAL,
+    PROTOBUF_C_TYPE_MESSAGE,
+    offsetof(Pkt, pkt_case),
+    offsetof(Pkt, update_remove_htlc),
+    &update_remove_htlc__descriptor,
+    NULL,
+    0 | PROTOBUF_C_FIELD_FLAG_ONEOF,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
+  {
+    "update_remove_htlc_delay",
+    8,
+    PROTOBUF_C_LABEL_OPTIONAL,
+    PROTOBUF_C_TYPE_MESSAGE,
+    offsetof(Pkt, pkt_case),
+    offsetof(Pkt, update_remove_htlc_delay),
+    &update_remove_htlc_delay__descriptor,
+    NULL,
+    0 | PROTOBUF_C_FIELD_FLAG_ONEOF,             /* flags */
+    0,NULL,NULL    /* reserved1,reserved2, etc */
+  },
   {
     "open",
     201,
@@ -1744,25 +2183,29 @@ static const ProtobufCFieldDescriptor pkt__field_descriptors[11] =
   },
 };
 static const unsigned pkt__field_indices_by_name[] = {
-  8,   /* field[8] = close */
-  9,   /* field[9] = close_complete */
-  10,   /* field[10] = error */
-  4,   /* field[4] = open */
-  5,   /* field[5] = open_anchor */
-  6,   /* field[6] = open_commit_sig */
-  7,   /* field[7] = open_complete */
+  12,   /* field[12] = close */
+  13,   /* field[13] = close_complete */
+  14,   /* field[14] = error */
+  8,   /* field[8] = open */
+  9,   /* field[9] = open_anchor */
+  10,   /* field[10] = open_commit_sig */
+  11,   /* field[11] = open_complete */
   0,   /* field[0] = update */
-  1,   /* field[1] = update_accept */
-  3,   /* field[3] = update_complete */
-  2,   /* field[2] = update_signature */
+  2,   /* field[2] = update_accept */
+  1,   /* field[1] = update_add_htlc */
+  4,   /* field[4] = update_complete */
+  5,   /* field[5] = update_complete_htlc */
+  6,   /* field[6] = update_remove_htlc */
+  7,   /* field[7] = update_remove_htlc_delay */
+  3,   /* field[3] = update_signature */
 };
 static const ProtobufCIntRange pkt__number_ranges[4 + 1] =
 {
   { 1, 0 },
-  { 201, 4 },
-  { 401, 8 },
-  { 1000, 10 },
-  { 0, 11 }
+  { 201, 8 },
+  { 401, 12 },
+  { 1000, 14 },
+  { 0, 15 }
 };
 const ProtobufCMessageDescriptor pkt__descriptor =
 {
@@ -1772,7 +2215,7 @@ const ProtobufCMessageDescriptor pkt__descriptor =
   "Pkt",
   "",
   sizeof(Pkt),
-  11,
+  15,
   pkt__field_descriptors,
   pkt__field_indices_by_name,
   4,  pkt__number_ranges,
diff --git a/lightning.pb-c.h b/lightning.pb-c.h
index 4ddda05a0..5913452a7 100644
--- a/lightning.pb-c.h
+++ b/lightning.pb-c.h
@@ -24,6 +24,10 @@ typedef struct _OpenAnchor OpenAnchor;
 typedef struct _OpenCommitSig OpenCommitSig;
 typedef struct _OpenComplete OpenComplete;
 typedef struct _Update Update;
+typedef struct _UpdateAddHtlc UpdateAddHtlc;
+typedef struct _UpdateCompleteHtlc UpdateCompleteHtlc;
+typedef struct _UpdateRemoveHtlc UpdateRemoveHtlc;
+typedef struct _UpdateRemoveHtlcDelay UpdateRemoveHtlcDelay;
 typedef struct _UpdateAccept UpdateAccept;
 typedef struct _UpdateSignature UpdateSignature;
 typedef struct _UpdateComplete UpdateComplete;
@@ -229,9 +233,6 @@ struct  _Update
   /*
    * Change in current payment to-me (implies reverse to-you).
    */
-  /*
-   * FIXME: optional HTLC ops.
-   */
   int64_t delta;
 };
 #define UPDATE__INIT \
@@ -239,6 +240,94 @@ struct  _Update
     , NULL, 0 }
 
 
+/*
+ * Start a new commitment tx to add an HTLC me -> you.
+ */
+struct  _UpdateAddHtlc
+{
+  ProtobufCMessage base;
+  /*
+   * Hash for which I will supply preimage to revoke this commitment tx.
+   */
+  Sha256Hash *revocation_hash;
+  /*
+   * Amount for htlc
+   */
+  uint64_t amount;
+  /*
+   * Hash for HTLC R value.
+   */
+  Sha256Hash *r_hash;
+  /*
+   * Time at which HTLC expires (absolute)
+   */
+  /*
+   * FIXME: Routing information.
+   */
+  Locktime *locktime;
+};
+#define UPDATE_ADD_HTLC__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&update_add_htlc__descriptor) \
+    , NULL, 0, NULL, NULL }
+
+
+/*
+ * Complete an HTLC
+ */
+struct  _UpdateCompleteHtlc
+{
+  ProtobufCMessage base;
+  /*
+   * Hash for which I will supply preimage to revoke this commitment tx.
+   */
+  Sha256Hash *revocation_hash;
+  /*
+   * HTLC R value.
+   */
+  Sha256Hash *r;
+};
+#define UPDATE_COMPLETE_HTLC__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&update_complete_htlc__descriptor) \
+    , NULL, NULL }
+
+
+/*
+ * Remove an HTLC
+ */
+struct  _UpdateRemoveHtlc
+{
+  ProtobufCMessage base;
+  /*
+   * Hash for which I will supply preimage to revoke this commitment tx.
+   */
+  Sha256Hash *revocation_hash;
+  /*
+   * Hash for HTLC R value.
+   */
+  Sha256Hash *r_hash;
+};
+#define UPDATE_REMOVE_HTLC__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&update_remove_htlc__descriptor) \
+    , NULL, NULL }
+
+
+/*
+ * Respond to an HTLC remove request: not yet.
+ * Expect a remove_htlc later.
+ */
+struct  _UpdateRemoveHtlcDelay
+{
+  ProtobufCMessage base;
+  /*
+   * Hash for HTLC R value.
+   */
+  Sha256Hash *r_hash;
+};
+#define UPDATE_REMOVE_HTLC_DELAY__INIT \
+ { PROTOBUF_C_MESSAGE_INIT (&update_remove_htlc_delay__descriptor) \
+    , NULL }
+
+
 /*
  * OK, I accept that update; here's your signature.
  */
@@ -353,9 +442,13 @@ typedef enum {
   PKT__PKT_OPEN_COMMIT_SIG = 203,
   PKT__PKT_OPEN_COMPLETE = 204,
   PKT__PKT_UPDATE = 1,
-  PKT__PKT_UPDATE_ACCEPT = 2,
-  PKT__PKT_UPDATE_SIGNATURE = 3,
-  PKT__PKT_UPDATE_COMPLETE = 4,
+  PKT__PKT_UPDATE_ADD_HTLC = 2,
+  PKT__PKT_UPDATE_ACCEPT = 3,
+  PKT__PKT_UPDATE_SIGNATURE = 4,
+  PKT__PKT_UPDATE_COMPLETE = 5,
+  PKT__PKT_UPDATE_COMPLETE_HTLC = 6,
+  PKT__PKT_UPDATE_REMOVE_HTLC = 7,
+  PKT__PKT_UPDATE_REMOVE_HTLC_DELAY = 8,
   PKT__PKT_CLOSE = 401,
   PKT__PKT_CLOSE_COMPLETE = 402,
   PKT__PKT_ERROR = 1000,
@@ -380,9 +473,13 @@ struct  _Pkt
      * Updating (most common)
      */
     Update *update;
+    UpdateAddHtlc *update_add_htlc;
     UpdateAccept *update_accept;
     UpdateSignature *update_signature;
     UpdateComplete *update_complete;
+    UpdateCompleteHtlc *update_complete_htlc;
+    UpdateRemoveHtlc *update_remove_htlc;
+    UpdateRemoveHtlcDelay *update_remove_htlc_delay;
     /*
      * Closing
      */
@@ -570,6 +667,82 @@ Update *
 void   update__free_unpacked
                      (Update *message,
                       ProtobufCAllocator *allocator);
+/* UpdateAddHtlc methods */
+void   update_add_htlc__init
+                     (UpdateAddHtlc         *message);
+size_t update_add_htlc__get_packed_size
+                     (const UpdateAddHtlc   *message);
+size_t update_add_htlc__pack
+                     (const UpdateAddHtlc   *message,
+                      uint8_t             *out);
+size_t update_add_htlc__pack_to_buffer
+                     (const UpdateAddHtlc   *message,
+                      ProtobufCBuffer     *buffer);
+UpdateAddHtlc *
+       update_add_htlc__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   update_add_htlc__free_unpacked
+                     (UpdateAddHtlc *message,
+                      ProtobufCAllocator *allocator);
+/* UpdateCompleteHtlc methods */
+void   update_complete_htlc__init
+                     (UpdateCompleteHtlc         *message);
+size_t update_complete_htlc__get_packed_size
+                     (const UpdateCompleteHtlc   *message);
+size_t update_complete_htlc__pack
+                     (const UpdateCompleteHtlc   *message,
+                      uint8_t             *out);
+size_t update_complete_htlc__pack_to_buffer
+                     (const UpdateCompleteHtlc   *message,
+                      ProtobufCBuffer     *buffer);
+UpdateCompleteHtlc *
+       update_complete_htlc__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   update_complete_htlc__free_unpacked
+                     (UpdateCompleteHtlc *message,
+                      ProtobufCAllocator *allocator);
+/* UpdateRemoveHtlc methods */
+void   update_remove_htlc__init
+                     (UpdateRemoveHtlc         *message);
+size_t update_remove_htlc__get_packed_size
+                     (const UpdateRemoveHtlc   *message);
+size_t update_remove_htlc__pack
+                     (const UpdateRemoveHtlc   *message,
+                      uint8_t             *out);
+size_t update_remove_htlc__pack_to_buffer
+                     (const UpdateRemoveHtlc   *message,
+                      ProtobufCBuffer     *buffer);
+UpdateRemoveHtlc *
+       update_remove_htlc__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   update_remove_htlc__free_unpacked
+                     (UpdateRemoveHtlc *message,
+                      ProtobufCAllocator *allocator);
+/* UpdateRemoveHtlcDelay methods */
+void   update_remove_htlc_delay__init
+                     (UpdateRemoveHtlcDelay         *message);
+size_t update_remove_htlc_delay__get_packed_size
+                     (const UpdateRemoveHtlcDelay   *message);
+size_t update_remove_htlc_delay__pack
+                     (const UpdateRemoveHtlcDelay   *message,
+                      uint8_t             *out);
+size_t update_remove_htlc_delay__pack_to_buffer
+                     (const UpdateRemoveHtlcDelay   *message,
+                      ProtobufCBuffer     *buffer);
+UpdateRemoveHtlcDelay *
+       update_remove_htlc_delay__unpack
+                     (ProtobufCAllocator  *allocator,
+                      size_t               len,
+                      const uint8_t       *data);
+void   update_remove_htlc_delay__free_unpacked
+                     (UpdateRemoveHtlcDelay *message,
+                      ProtobufCAllocator *allocator);
 /* UpdateAccept methods */
 void   update_accept__init
                      (UpdateAccept         *message);
@@ -732,6 +905,18 @@ typedef void (*OpenComplete_Closure)
 typedef void (*Update_Closure)
                  (const Update *message,
                   void *closure_data);
+typedef void (*UpdateAddHtlc_Closure)
+                 (const UpdateAddHtlc *message,
+                  void *closure_data);
+typedef void (*UpdateCompleteHtlc_Closure)
+                 (const UpdateCompleteHtlc *message,
+                  void *closure_data);
+typedef void (*UpdateRemoveHtlc_Closure)
+                 (const UpdateRemoveHtlc *message,
+                  void *closure_data);
+typedef void (*UpdateRemoveHtlcDelay_Closure)
+                 (const UpdateRemoveHtlcDelay *message,
+                  void *closure_data);
 typedef void (*UpdateAccept_Closure)
                  (const UpdateAccept *message,
                   void *closure_data);
@@ -769,6 +954,10 @@ extern const ProtobufCMessageDescriptor open_anchor__descriptor;
 extern const ProtobufCMessageDescriptor open_commit_sig__descriptor;
 extern const ProtobufCMessageDescriptor open_complete__descriptor;
 extern const ProtobufCMessageDescriptor update__descriptor;
+extern const ProtobufCMessageDescriptor update_add_htlc__descriptor;
+extern const ProtobufCMessageDescriptor update_complete_htlc__descriptor;
+extern const ProtobufCMessageDescriptor update_remove_htlc__descriptor;
+extern const ProtobufCMessageDescriptor update_remove_htlc_delay__descriptor;
 extern const ProtobufCMessageDescriptor update_accept__descriptor;
 extern const ProtobufCMessageDescriptor update_signature__descriptor;
 extern const ProtobufCMessageDescriptor update_complete__descriptor;
diff --git a/lightning.proto b/lightning.proto
index 793181e7c..9ef1d1e4b 100644
--- a/lightning.proto
+++ b/lightning.proto
@@ -35,7 +35,7 @@ message locktime {
 message bitcoin_pubkey {
   // Either 65 or 33 bytes.
   required bytes key = 1;
-};
+}
 
 //
 // Packet Types
@@ -98,10 +98,45 @@ message update {
   required sha256_hash revocation_hash = 1;
   // Change in current payment to-me (implies reverse to-you).
   required sint64 delta = 2;
-  // FIXME: optional HTLC ops.
 }
 
-// OK, I accept that update; here's your signature.
+// Start a new commitment tx to add an HTLC me -> you.
+message update_add_htlc {
+  // Hash for which I will supply preimage to revoke this commitment tx.
+  required sha256_hash revocation_hash = 1;
+  // Amount for htlc
+  required uint64 amount = 2;
+  // Hash for HTLC R value.
+  required sha256_hash r_hash = 3;
+  // Time at which HTLC expires (absolute)
+  required locktime locktime = 4;
+  // FIXME: Routing information.
+}
+
+// Complete an HTLC
+message update_complete_htlc {
+  // Hash for which I will supply preimage to revoke this commitment tx.
+  required sha256_hash revocation_hash = 1;
+  // HTLC R value.
+  required sha256_hash r = 3;
+}
+
+// Remove an HTLC
+message update_remove_htlc {
+  // Hash for which I will supply preimage to revoke this commitment tx.
+  required sha256_hash revocation_hash = 1;
+  // Hash for HTLC R value.
+  required sha256_hash r_hash = 3;
+}
+
+// Respond to an HTLC remove request: not yet.
+// Expect a remove_htlc later.
+message update_remove_htlc_delay {
+  // Hash for HTLC R value.
+  required sha256_hash r_hash = 1;
+}
+
+  // OK, I accept that update; here's your signature.
 message update_accept {
   // Signature for your new commitment tx.
   required signature sig = 1;
@@ -154,9 +189,13 @@ message pkt {
     open_complete open_complete = 204;
     // Updating (most common)
     update update = 1;
-    update_accept update_accept = 2;
-    update_signature update_signature = 3;
-    update_complete update_complete = 4;
+    update_add_htlc update_add_htlc = 2;
+    update_accept update_accept = 3;
+    update_signature update_signature = 4;
+    update_complete update_complete = 5;
+    update_complete_htlc update_complete_htlc = 6;
+    update_remove_htlc update_remove_htlc = 7;
+    update_remove_htlc_delay update_remove_htlc_delay = 8;
     // Closing
     close_channel close = 401;
     close_channel_complete close_complete = 402;