diff --git a/README.md b/README.textile
similarity index 100%
rename from README.md
rename to README.textile
diff --git a/lib/Redmine/DB/CTX.pm b/lib/Redmine/DB/CTX.pm
index e9d1634f78f9ef7c157d0533ec63562c6bd22af3..824b93304a5dea4bd1162bee7ffad289cedcf61b 100644
--- a/lib/Redmine/DB/CTX.pm
+++ b/lib/Redmine/DB/CTX.pm
@@ -109,7 +109,7 @@ sub get_DDL { return ($TABLE_sync_contexts, $TABLE_syncs); }
 
 =head2 $context->init_translation()
 
-Read the known translation table for the give synchronisation context
+Read the known translation table for the given synchronisation context
 and keep it around.
 
 =cut
diff --git a/lib/Redmine/DB/MySQL.pm b/lib/Redmine/DB/MySQL.pm
index cd49e17c20576fd86545dcf2e60b7397d6ac6ee8..ca7c36794a6befeabe9def8cbd63086de8f65028 100644
--- a/lib/Redmine/DB/MySQL.pm
+++ b/lib/Redmine/DB/MySQL.pm
@@ -98,6 +98,47 @@ sub get_all_x
   $tt;
 }
 
+sub fetch_custom
+{
+  my $db= shift;
+  my $cfid= shift;
+  my $cfty= shift || 'Issue';
+
+  my $res= $db->get_all_x ('custom_values',
+      [ "custom_field_id=? and customized_type=?", $cfid, $cfty ]);
+  $res;
+}
+
+sub change_custom_value
+{
+  my $db= shift;
+  my $cfid= shift;
+  my $cfty= shift || 'Issue';
+  my $cfref= shift; # ticket number or whatever
+  my $cfrid= shift; # record id
+  my $cfval= shift;
+
+  my $data=
+      { customized_type => $cfty, customized_id => $cfref,
+        custom_field_id => $cfid, value => $cfval };
+
+  print "change_custom_value: cfrid=[$cfrid] ", join (' ', %$data), "\n";
+  # return 0; # TODO: add flag to supress changes
+
+  my $res;
+  if (defined ($cfrid))
+  {
+    $db->update ('custom_values', $cfrid, $data);
+    $res= $cfrid;
+  }
+  else
+  {
+    $res= $db->insert ('custom_values', $data);
+  }
+
+  $res;
+}
+
 sub insert
 {
   my $self= shift;
@@ -153,7 +194,7 @@ sub update
   }
   push (@vals, $id);
 
-  my $ssu= "UPDATE `$table` SET ". join (' ', map { $_.'=?' } @vars) . ' WHERE id=?';
+  my $ssu= "UPDATE `$table` SET ". join (', ', map { $_.'=?' } @vars) . ' WHERE id=?';
   print "ssu=[$ssu]\n";
   print "vals: ", join (',', @vals), "\n";
   my $sth= $dbh->prepare($ssu);
diff --git a/lib/Redmine/Wrapper.pm b/lib/Redmine/Wrapper.pm
new file mode 100644
index 0000000000000000000000000000000000000000..3fcad8887d17216c053027d6b8fea7e3d190d27d
--- /dev/null
+++ b/lib/Redmine/Wrapper.pm
@@ -0,0 +1,123 @@
+
+package Redmine::Wrapper;
+
+use strict;
+
+use WebService::Redmine;
+
+sub new
+{
+  my $class= shift;
+
+  my $obj= {};
+  bless $obj, $class;
+
+  $obj->set (@_);
+
+  $obj;
+}
+
+sub set
+{
+  my $obj= shift;
+  my %par= @_;
+
+  my %res;
+  foreach my $par (keys %par)
+  {
+    $res{$par}= $obj->{$par};
+    $obj->{$par}= $par{$par};
+  }
+
+  (wantarray) ? %res : \%res;
+}
+
+# TODO: attach or connect are not really good names
+sub attach
+{
+  my $self= shift;
+
+  return $self->{_rm} if (exists ($self->{_rm}));
+
+  my $rm= new WebService::Redmine (%{$self->{'cfg'}->{'redmine'}});
+  # print "rm: ", Dumper ($rm);
+  $self->{_rm}= $rm;
+}
+
+sub fixup_issue
+{
+  my $self= shift;
+  my $issue= shift;
+  my $par= shift;
+
+  foreach my $key (keys %$par)
+  {
+    if ($key eq 'custom_fields')
+    {
+      transcribe_custom_fields ($self->{'cfg'}->{'custom_field_ids'}, $issue, $par->{'custom_fields'});
+    }
+  }
+}
+
+=head1 INTERNAL FUNCTIONS
+
+=head2 transcribe_custom_fields ($custom_field_id_mapping_table, $issue, $key_value_hashref)
+
+transcribe custom fields from a simple key/value list in
+$key_value_hashref into a hash_ref representing an issue
+($issue) using a mapping table for custom field ids stored in
+$custom_filed_id_mapping_table.
+
+=cut
+
+sub transcribe_custom_fields
+{
+  my $ids= shift;
+  my $issue= shift;
+  my $kv= shift;
+ 
+  print "ids: ", main::Dumper($ids);
+
+  $issue->{custom_fields}= [] unless (defined ($issue->{custom_fields}));
+  my $cf= $issue->{custom_fields};
+  my %idx;
+  for (my $i= 0; $i <= $#$cf; $i++)
+  {
+    my $cf_i= $cf->[$i];
+    $idx{$cf_i->{'name'}}= $i;
+  }
+  print "cf: ", main::Dumper($cf);
+
+  # update incoming custom fields
+  AN: foreach my $an (keys %$kv)
+  {
+    unless (exists ($ids->{$an}))
+    {
+      print "an=[$an] not present in id mapping table\n";
+      next AN;
+    }
+
+    my $new_val=
+    {
+      'value' => $kv->{$an},
+      'id' => $ids->{$an},
+      'name' => $an,
+    };
+
+    if (exists ($idx{$an}))
+    {
+      $cf->[$idx{$an}]= $new_val;
+    }
+    else
+    {
+      push (@$cf, $new_val); # TODO: maybe we should update %idx here as well
+    }
+  }
+
+  print "issue: ", main::Dumper($issue);
+}
+
+1;
+
+__END__
+